Jeśli rozumiesz stos bardzo dobrze, zrozumiesz, jak pamięć działa 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 funkcje są reprezentowane na stosie:
Sterta przechowuje dynamicznie przydzielane wartości.
Stos przechowuje wartości automatycznego przydzielania i usuwania.
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 warunek powrotu dowolnej funkcji zostanie spełniony, bez względu na to, czy załadował zmienne lokalne, czy nie, natychmiast powróci ze stosu z ramką stosu. Oznacza to, że za każdym razem, gdy jakakolwiek funkcja rekurencyjna zostanie spełniona warunek podstawowy, a my wstawimy znak powrotu po warunku podstawowym, warunek podstawowy nie będzie czekał na załadowanie zmiennych lokalnych, które znajdują się w części „else” programu. Natychmiast zwróci bieżącą ramkę ze stosu, po której następna ramka znajduje się teraz w rekordzie aktywacji.
Zobacz to w praktyce:
Zwolnienie bloku:
Tak więc teraz, gdy funkcja napotka instrukcję return, usuwa bieżącą ramkę ze stosu.
Podczas powrotu ze stosu wartości będą zwracane w odwrotnej kolejności niż pierwotna kolejność, w jakiej zostały przydzielone w stosie.