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).
Ich könnte unbegrenzt fortfahren, wenn Sie eine negative Zahl übergeben. – coredump
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