Jeśli rozumiesz stos bardzo dobrze, zrozumiesz, jak działa pamięć w programie, a jeśli zrozumiesz, jak pamięć działa w programie, zrozumiesz, jak przechowuje funkcje w programie, a jeśli zrozumiesz, jak przechowuje funkcje w programie, zrozumiesz, jak działa funkcja rekurencyjna, a jeśli zrozumiesz, jak działa funkcja rekurencyjna, zrozumiesz, jak działa kompilator, a jeśli zrozumiesz, jak działa kompilator, twój umysł będzie działał jako kompilator i bardzo łatwo debugujesz dowolny program
Pozwól mi wyjaśnić, jak działa stos:
Najpierw musisz wiedzieć, jak przechowywać funkcje w stosie:
Sterty przechowują wartości dynamicznego przydziału pamięci. Wartości automatycznej alokacji i usuwania magazynu stosu.
Rozumiemy na przykładzie:
def hello(x):
if x==1:
return "op"
else:
u=1
e=12
s=hello(x-1)
e+=1
print(s)
print(x)
u+=1
return e
hello(4)
Teraz zrozum części tego programu:
Zobaczmy teraz, co to jest stos, a jakie części stosu:
Przydział stosu:
Pamiętaj o jednej rzeczy, jeśli jakakolwiek funkcja zostanie „zwrócona” bez względu na to, że załadowała wszystkie lokalne zmienne lub cokolwiek, co natychmiast zwróci ze stosu, zmieni ramkę stosu. Oznacza to, że gdy jakakolwiek funkcja rekurencyjna uzyska warunek podstawowy, a my ustawimy return po warunku podstawowym, więc warunek podstawowy nie będzie czekał na załadowanie zmiennych lokalnych, które znajdują się w „innej” części programu, natychmiast zwróci bieżącą ramkę ze stosu, a teraz, jeśli jedna ramka powrót następnej klatki jest w rekordzie aktywacji. Zobacz to w praktyce:
Zwolnienie bloku:
Tak więc teraz, gdy funkcja znajdzie instrukcję return, usuwa bieżącą ramkę ze stosu.
podczas powrotu ze stosu wartość zostanie zwrócona w odwrotnej kolejności, w jakiej zostały przydzielone w stosie.
To bardzo krótki opis i jeśli chcesz dowiedzieć się więcej o stosie i podwójnej rekurencji, przeczytaj dwa posty na tym blogu:
Więcej informacji o stosie krok po kroku
Więcej informacji o Podwójnej rekurencji krok po kroku ze stosem