Hier eine funktionierende Version des Codes, der eine Liste in der richtigen Reihenfolge zurück (I ersetzt l
von n
):
(define (countup n)
(if (= 1 n)
(list n)
(append (countup (- n 1)) (list n))))
Leider gibt es ein Problem mit diesem Stück Code: es ist nicht Schwanz -rekursiv. Der Grund dafür ist, dass der rekursive Aufruf an countup
nicht in einer Endposition ist. Es ist nicht in Endposition, weil ich eine Anhängung des Ergebnisses von (countup (- l 1))
mache, so ist der Endanruf append
(oder list
wenn n = 1
) und nicht countup
. Dies bedeutet, dass es sich bei diesem Codeabschnitt um eine normale recusus-Funktion, aber um eine tail-rekursive Funktion handelt.
Überprüfen Sie diese link von Wikipedia für ein besseres Beispiel dafür, warum es nicht Tail-Recusrive ist.
Um es rekursiv zu machen, müssten Sie einen Akkumulator haben, der dafür verantwortlich ist, die gezählten Werte zu akkumulieren. Auf diese Weise könnten Sie den rekursiven Funktionsaufruf in eine Endposition setzen. Sehen Sie den Unterschied in der Verbindung, die ich Ihnen gab.
Zögern Sie nicht zu antworten, wenn Sie weitere Informationen benötigen.
Was soll es zurückgeben? Eine Liste von n Elementen, von 1 bis n in aufsteigender Reihenfolge, wobei n die Eingabe ist? –
Ja, genau. Liste mit n Elementen in aufsteigender Reihenfolge von 1 bis zur angegebenen Nummer. Entschuldigung, ich war nicht klarer. – user1299108
Es ist nicht Schwanz rekursiv. Der letzte Aufruf in dieser Funktion geht auf 'list' und nicht auf 'countup'. – knivil