Das Programm druckt die n-te Zahl der Serie Fibonacci.
Dieses Programm druckt nichts. Wenn Sie die Ausgabe sehen, ist es wahrscheinlich, weil Sie es aus dem Read-eval-Drucken-Loop (REPL) aufrufen, die ein Formular liest, wertet es aus, und dann druckt das Ergebnis. ZB könnten Sie tun:
CL-USER> (fibonacci 4)
2
Wenn Sie diesen Anruf in etwas anderes eingewickelt, obwohl, werden Sie sehen, dass es den Druck etwas nicht ist:
CL-USER> (progn (fibonacci 4) nil)
NIL
Wie Sie dies geschrieben habe, Es wird schwierig sein, sie so zu modifizieren, dass sie jede einzelne Fibonacci-Nummer nur einmal ausdrucken, da Sie eine Menge redundanter Berechnungen durchführen. Zum Beispiel der Aufruf
(fibonacci (- n 1))
wird berechnet (fibonacci (- n 1))
, aber so wird der direkte Aufruf von
(fibonacci (- n 2))
Das heißt, dass Sie wahrscheinlich die gesamte Sequenz drucken nicht jeden Aufruf fibonacci
wollen. Wenn Sie das tun, beachten Sie jedoch, dass (print x)
den Wert von x
zurückkehrt, so können Sie einfach tun:
(defun fibonacci(n)
(cond
((eq n 1) 0)
((eq n 2) 1)
((print (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))))
CL-USER> (progn (fibonacci 6) nil)
1
2
1
3
1
2
5
NIL
Sie werden einige wiederholt Teile siehe da, da redundante Berechnung gibt.Sie können die Serie wesentlich effizienter berechnen jedoch durch aus den ersten beiden Zahlen beginnen und Zählen:
(defun fibonacci (n)
(do ((a 1 b)
(b 1 (print (+ a b)))
(n n (1- n)))
((zerop n) b)))
CL-USER> (fibonacci 6)
2
3
5
8
13
21
Eigentlich darf ich keine Umkehrfunktion verwenden. Ich muss es in einer einzigen rekursiven Funktion tun, ohne eine eingebaute Funktion wie Reverse zu verwenden. Danke trotzdem. – wackyTechie
@wackyTechie Sie sollten Einschränkungen in Ihrer Frage erwähnen. Ich habe hinzugefügt, wie es ohne Akkumulator geht. – Sylwester
Ja, realisierte es später. Danke vielmals! – wackyTechie