2016-05-01 23 views
0

Ich habe ein wenig Probleme beim Erstellen einer rekursiven Funktion in Scheme. Ich muss eine Funktion namens foo (x) erstellen, die rekursiv alle Potenzen addiert. Zum Beispiel wäre foo (5) 5^4 + 4^3 + 3^2 + 2^1 + 1^0 = 701. Die Stoppbedingung ist, wenn x = 0, dann Null zurückgeben. Else dann zurück x^x-1 + foo (x-1) Hier ist, was ich bisher für meine Funktion habe:Versuchen, eine rekursive Funktion im Schema zu erstellen?

(define (foo x) 
    (cond ((zero? x) 0) 
    (else (+(expt(x (- x 1)))foo(- x 1))))) 

Antwort

1

Sie müssen nur mit den Klammern vorsichtiger sein, insbesondere feststellen, dass die richtigen So rufen Sie eine Prozedur auf: (foo x), anstatt: foo(x). Das sollte funktionieren:

(define (foo x) 
    (cond ((zero? x) 0) 
     (else (+ (expt x (- x 1)) 
       (foo (- x 1)))))) 

(foo 5) 
=> 701 
0

Erlauben Sie mir, den Code zu identifizieren. Ich kann es nur in DrRacket geklebt und drücken Sie Strg + Ich habe dann die Argumente + auf einer Linie jeder:

(define (foo x) 
    (cond ((zero? x) 0) 
     (else (+ (expt (x (- x 1))) 
       foo 
       (- x 1))))) 

So das Basismodell ist in Ordnung, aber Ihr Standard-Fall sieht sehr aus. x wird als Prozedur behandelt, da es Klammern enthält und - auch x verwendet, als wäre es eine Zahl. Es kann nicht beides sein.

foo ist, da sie Klammern nicht nicht angewendet haben um ihn herum, so dass es zu einem Verfahren Wert auswertet, während + alle seine Argumente numerisch sein erwarten.

Die Regeln des Scheme sind, dass Klammern Angelegenheiten. x und (x) sind zwei völlig verschiedene Dinge. Die erste x kann einen beliebigen Wert haben, aber (x) ist eine Anwendung, also x müssen zu einer Prozedur auswerten. Einige Ausnahmen sind für spezielle Formulare, die Sie auswendig kennen müssen, wie cond und , aber es ist sehr wichtig zu wissen, dass Sie die Bedeutung eines Programms ändern, indem Sie Klammern hinzufügen.

könnte die korrekte Definition der Prozedur sein:

(define (foo x) 
    (if (zero? x) 
     0 
     (+ (expt x (- x 1)) 
     (foo (- x 1))))) 

(foo 5) ; ==> 701 

Hier habe ich cond-if geändert, da wurden verwendet, um keine von cond s Funktionen. Ich sehe cond Ich erwarte entweder Nebenwirkungen oder mehr als ein Prädikat.

Verwandte Themen