HINWEIS: Ich würde dies gerne tun, ohne Rackets in Ausnahmen gebaut, wenn möglich.Wie höre ich die Rekursion auf und gebe etwas im Racket zurück?
Ich habe viele Funktionen, die andere Funktionen aufrufen und rekursiv auf die ursprüngliche Funktion zurückrufen können. Unter bestimmten Bedingungen auf dem Weg möchte ich weitere rekursive Schritte stoppen, und keine anderen Funktionen mehr aufrufen und einfach einen Wert/String zurückgeben (der Stack kann ignoriert werden, wenn die Bedingung erfüllt ist) .. hier ist ein künstliches Beispiel, das hoffentlich zeigen, was ich versuche zu erreichen:
(define (add expr0 expr1)
(cond
[(list? expr0) (add (cadr expr0) (cadr (cdr expr0)))]
[(list? expr1) (add (cadr expr1) (cadr (cdr expr1)))]
[else (if (or (equal? expr0 '0) (equal? expr1 '0))
'(Adding Zero)
(+ expr0 expr1))]
))
Wenn dies meine Funktion ist und ich nannte es mit (add (hinzufügen 2 0) 3), dann das Ziel wäre, einfach die gesamte Zeichenfolge zurück ' (Hinzufügen von Null) ANYTIME, dass eine Null ist einer der Ausdrücke, anstatt den rekursiven Aufruf an (add '(Adding Zero) 3)
Gibt es eine Möglichkeit, im Wesentlichen aus der Rekursion "zu brechen"? Mein Problem ist, dass, wenn ich schon tief drinnen bin, es irgendwann versuchen wird, "(Zero hinzufügen) auszuwerten, was es nicht weiß, und ich habe das Gefühl, dass ich das tun könnte, ohne jedem einen expliziten Check zu machen expr ..
Jede Führung wäre großartig.
Solange Ihre Funktionen tail rekursiv sind, gibt es kein Problem, und der Wert Ihres letzten Ausdrucks wird zurückgegeben. Es gibt keinen tiefen Call-Stack mit TCO. –
Beide rekursiven Aufrufe sind Tail-Aufrufe, daher nennt SICP eine "iterative Prozedur" - sie verwendet konstanten Speicherplatz und wird zu einer Schleife kompiliert. – molbdnilo