Ich habe gestern mit dem Lispeln angefangen, also bitte entschuldigen Sie, wenn ich wirklich einen Anfängerfehler mache. Ich versuche, eine Funktion zu erstellen, die die Glockenzahl mit dem Glockendreieck berechnet und meine rekursive Dreiecksfunktion nicht richtig funktioniert. Ich bin mir auch sicher, wenn ich meine rekursive Dreiecksfunktion funktionierte, dass meine rekursive Glockenfunktion irgendwie auch gebrochen ist.Lisp rekursive Funktion fehlt Basisfall beim ersten Aufruf
Wenn ich meine Dreieck Funktion zu testen habe ich den Ausgang:
(defun bell(l n)
(if(< n 1)(list 1))
(if (= n 1)(last l))
(bell (triangle (reverse l) (last l) (list-length l)) (- n 1))
)
(defun triangle(pL nL i)
(if(<= i 0)
(write "equals zero!")
(reverse nL)
)
(triangle pL (append (list (+ (nth i pL) (nth i nL))) nL) (- i 1))
)
(write (triangle '(1) '(1) 0))
=>
"equals zero!""equals zero!"
*** - NTH: -1 is not a non-negative integer
Aus irgendeinem Grund, es ist mein Debug-Code gedruckt wird zweimal, obwohl die Funktion sollte mein Basismodell, von dem ersten Aufruf treffen.
Ich rollte die Bearbeitung auf den Titel, weil während OP zurück ** Wenn ** versucht wird, ein Dreieck zu erstellen, hat OP auch das eigentliche Problem hier identifiziert: Die Funktion * endet nicht mit dem erwarteten Basisfall, und das liegt an der Gruppierung der ** if ** s. Während eine Lösung für das Dreieck OP helfen könnte, konzentriert sich die Frage wirklich darauf, warum zum Beispiel '(defun foo (n) (if (= n 0) 35) 42) immer 42 zurückgibt, selbst wenn n ist 0. Das liegt daran, dass der Code das Ergebnis von ** if ** ignoriert. –
@JoshuaTaylor Ich verstehe deinen Standpunkt. Der OP fragt nicht, wie er das Dreieck lösen soll, sondern warum er diesen Fehler hat. Wie auch immer, ich dachte, der Beitrag könnte hilfreicher sein und mit einem passenderen Titel leicht gefunden werden, da der aktuelle nicht einmal den Fehler darstellt. – FrankS101