Generieren von Fibonacci-Reihe in Lisp mit Rekursion?
Ich bin ein Neuling in LISP. Ich bin versucht zu schreiben, eine Funktion in CLISP zu generieren, die die ersten n zahlen der Fibonacci-Reihe.
Dies ist, was ich bisher getan habe.
(defun fibonacci(n)
(cond
((eq n 1) 0)
((eq n 2) 1)
((+ (fibonacci (- n 1)) (fibonacci (- n 2))))))))
Das Programm druckt die N-te Zahl der Fibonacci-Reihe. Ich versuche es so zu modifizieren, dass er drucken würde, die Serie, und nicht nur die N-te Begriff.
Ist es möglich, dies zu tun in nur einer einzigen rekursiven Funktion, mit nur die grundlegenden Funktionen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja:
Die Logik dahinter ist, dass Sie brauchen, um wissen der beiden vorherigen zahlen, die zum generieren der nächsten.
Anstatt nur eine Folge, die ich sammeln alle
a
-s bisn
null ist.BEARBEITEN Ohne umkehren es ist ein wenig ineffizient:
Diesem Programm nicht alles drucken. Wenn Sie sehen, Ausgang, ist es wahrscheinlich, weil Sie fordern es von der read-eval-drucken-loop (REPL), das liest sich ein Formular, bewertet es, und dann Drucke das Ergebnis. E. g., Sie möglicherweise tun:
Wenn Sie eingewickelt, dass call-in etwas anderes, obwohl, werden Sie sehen, dass es nicht den Druck alles:
Als Sie habe dies geschrieben, wird es schwierig sein ihn zu ändern, zu drucken, jede fibonacci-Zahl nur einmal, da Sie eine Menge redundanter Berechnungen. Zum Beispiel, wird der Anruf zu
berechnen
(fibonacci (- n 1))
, aber so wird der direkte Aufruf zuDas bedeutet, dass Sie wahrscheinlich nicht wollen, dass jeder Aufruf
fibonacci
zum drucken der gesamten Sequenz. Wenn Sie dies tun, aber beachten Sie, dass(print x)
gibt den Wert vonx
, so können Sie einfach tun:Sehen Sie einige wiederholt Teile gibt, da gibt es redundante Berechnung. Sie können berechnen die Serie viel mehr effizient, jedoch, ausgehend von den ersten beiden zahlen und das zählen bis:
Ein-option, um die grundlegende Struktur, die verwendet wird, um eine weitere Flagge, um die Funktion, die sagt, wenn Sie möchten, drucken oder nicht:
Die Idee ist, dass wenn du die zwei rekursive Aufrufe nur in den ersten passieren Sie unten die Flagge über das tun der Druck-und in der zweiten rufen Sie stattdessen übergeben Sie NULL, um zu vermeiden, erneut zu drucken.