2010-12-12 5 views
0

Ich möchte die geraden Einträge in einer Liste hinzufügen und habe den folgenden Algorithmus, den ich geschrieben habe, um das Ziel zu erreichen.Fügen Sie gerade Einträge in der Liste hinzu.

Der Fehler Ich erhalte ist:

+: erwartet < Nummer> als 2. Argument eingeben, gegeben: # < Leere>; andere Argumente waren: 4

Der Code:

(define (mylength alist cnt) 
    (if (null? alist) 
    0 

    (if (= (modulo cnt 2) 0)(+ (car alist) (mylength (cdr alist) (+ cnt 1))))) 
    (if (= (modulo cnt 2) 1)(mylength (cdr alist) (+ cnt 1)))) 

Können Sie raten Sie bitte auf den i) Fehler ii) Logik des Algorithmus

Dank!

Antwort

2

Zuerst einrücken Code richtig:

(define (mylength alist cnt) 
    (if (null? alist)          ; 
    0              ; this section is wasted because 
    (if (= (modulo cnt 2) 0)        ; it's not the last expression 
     (+ (car alist) (mylength (cdr alist) (+ cnt 1))))) ; 
    (if (= (modulo cnt 2) 1)    ; this if is the last expression, but 
    (mylength (cdr alist) (+ cnt 1)))) ; if it's false you get #<void> 

Sie sollten nicht if Ausdrücke, die beide nicht die wahre und falsche Zweige haben. Sie müssen sich daran erinnern, dass dies nicht C ist, und alles, was nicht der letzte Ausdruck ist, wird ausgeführt und dann weggeworfen.

Kombinieren Sie die letzten beiden if-Anweisungen in eine if Aussage:

(define (mylength alist cnt) 
    (if (null? alist) 
    0 
    (if (= (modulo cnt 2) 0) 
     (+ (car alist) (mylength (cdr alist) (+ cnt 1))) 
     (mylength (cdr alist) (+ cnt 1))))) 

Edit: Als ich „alles, was nicht der letzte Ausdruck ist wird laufen und dann weggeworfen“ schrieb, ich meinte:

(begin 
    (+ 2 2) 
    (+ 4 1) 
    (+ 1 0) 
    (+ 1 1)) => 2 

(let ((x 5)) 
    (add1 x) 
    (+ x 2) 
    (* x 2)) => 10 

((lambda() 
    (if #t 3) 
    (if #f 0 4) 
    (if #t 2))) => 2 
+0

danke erjiang. Ich bekomme nicht den Teil, wo du gesagt hast "alles, was nicht der letzte Ausdruck ist, wird weggerannt und weggeworfen". Können Sie das bitte näher ausführen? – Roy

+0

sehe meine Bearbeitung auf die Antwort – erjiang

0

Die andere Antwort ist völlig richtig, aber Ihre Schnittstelle ist nicht sehr scheme-y. Dies ist eine häufigere Form mit Schwanzrekursion.

Verwandte Themen