2016-07-20 7 views
-2

Ich bin neu in LISP und ich versuche Rekursion zu verstehen.Erkläre mir meinen LISP Code

Was ich weiß ist, dass Rekursion eine STOP-Bedingung benötigt. In meinem Code unten, können Sie mir erklären, warum (equal x 0) 1 ist meine STOP-Bedingung, da fact(- X 1) unbegrenzt fortgesetzt werden könnte, wie in meinem zweiten Zustand, habe ich t die zweite Zeile meiner cond, was bedeutet, dass es fortgesetzt werden soll.

ABER wenn ich das Programm ausführen, funktioniert es aber gut. Unten ist mein Code (zufällig gefunden)

(defun fact(x) 
    (cond 
     ((equal x 0) 1) 
     (t (*(fact(- x 1)) x)) 
    ) 
) 
+0

Ich könnte unbegrenzt fortfahren, wenn Sie eine negative Zahl übergeben. – coredump

+0

Das Ergebnis von entweder consequent oder alternativ ist der Wert des If und der letzte Ausdruck ist der Rückgabewert. In JS wäre es wie folgt: 'function fact (x) {return x === 0? 1: x * Tatsache (x-1);} ' – Sylwester

Antwort

0

cond Expresssions eine Reihe von Klauseln. Jede Klausel hat die Form (expr1 expr2). Wenn der expr1 als wahr auswertet, dann expr2 is evaluated and that is the returned value of the cond`. Keine anderen Klauseln werden ausgewertet. So

, einmal x wird 0 die ersten Abschnitte von cond true ausgewertet und diesen Anruf zu fact kehrt 1. Die andere Klausel von cond hat einen ersten Ausdruck von t, der per Definition wahr ist; Wenn also die erste Klausel nicht verwendet wird, wird immer die zweite Klausel verwendet. (A cond Klausel mit t ist wie ein "andere" in einer "if" Anweisung in anderer langugaes.)

Diese Funktion ist rekursiv, wenn Sie es mit einem Argumente von 2 nennen, überprüft er, ob 2 == 0, Es multipliziert 2 nicht mit dem Wert, der durch rekursives Aufrufen von sich selbst mit 1 zurückgegeben wird. Da 1! = 0 wird der Wert von 1 multipliziert mit dem Wert von rekursiv sich selbst mit 0 aufrufen. Da 0 gleich 0 gleich ist gibt 1 zurück, das eine Ebene verwendet, um 1 zurückzugeben, die dann in der obersten Ebene dieser Rekursion verwendet wird, um 2 zurückzugeben.

Common Lisp hat eine Funktion trace, die Ihnen anzeigen lässt, wann Ihre Funktion aufgerufen wird und mit welchen Argumenten . Typischerweise wird jeder rekursive Aufruf eingerückt werden, so dass Sie so etwas wie dies sehen:

(fact 2) 
    (fact 1) 
     (fact 0) 

die für das Verständnis dieser Funktion kann hilfreich sein.

(Wie in einem Kommentar erwähnt - diese Funktion fängt nicht den Fall eines negativen Eingangs - aber das ist Fehlerbehandlung und könnte leicht behoben werden).