Als Witz vor ein paar Monaten, suchte ein Mitarbeiter von mir, "den Hitzetod des Universums zu beschleunigen", indem er die Fibonacci-Zahlen unter Verwendung dieses Exponentialalgorithmus berechnete:
%Vor%Wie bewirkt das nicht einen Stackoverflow in C #? Wir schafften es, zu Fib (52) zu kommen, bevor wir aufgaben (und Fib (51) brauchte viele Stunden). Ich würde denken, dass dies den Stapel hart genug schlagen würde, um einen Stapelüberlauf zu verursachen, da die CLR standardmäßig nur 1M dem Stapel zuordnet. Ich bin mir auch ziemlich sicher, dass dies nicht für Tail-Rekursion geeignet ist.
Die rekursiven Aufrufe werden nicht gleichzeitig, sondern sequentiell berechnet, was bedeutet, dass Fib(n - 2)
erst nach Fib(n - 1)
berechnet wird (oder umgekehrt). Dies bedeutet, dass, obwohl Sie 2^n
rekursive Aufrufe erstellen, nur n
gleichzeitig aktiv ist. Daher benötigt Fib(52)
nur Platz für 52
stackframes von Fib
, was keinen merklichen Stack-Platz benötigt.
Tags und Links algorithm .net c# stack-overflow fibonacci