2010-12-12 19 views
0

偶数項目をリストに追加したいのですが、目的を達成するために次のアルゴリズムを使用しています。リストに項目を追加する

私は取得していますエラーは次のとおりです。

+:与えられた、第二引数として> <番号を入力見込ん:>#<無効。その他の引数は次の通りであった:4

コード:

(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)))) 

あなたは にアドバイスしてもらえI)エラー アルゴリズムのⅱ)ロジック

ありがとう!まず

答えて

2

、正しくコードをインデント:

(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> 

あなたは真と偽の枝の両方を持っていないif表現を持つべきではありません。これはCではないことを覚えておかなければなりません。最後の表現ではないものは実行され、次に破棄されます。

コンバイン最後の二つの場合1つのif文に文:

(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))))) 

編集:私は「最後の式を実行して、離れてスローされますない何かを」書いた、私は意味:

(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

erjiangに感謝します。私は、あなたが「最後の表現ではないものは実行されて投げ捨てられます」と言いました。あなたはそれを詳述できますか? – Roy

+0

答えに私の編集を見る – erjiang

0

もう1つの答えは完全ですが、あなたのインターフェースはあまりscheme-yではありません。これは末尾再帰を伴うより一般的な形式です。

; Assumes given a list of numbers. Returns sum of even indices. 
(define (mylength alist) 
    (let helper ((alist alist) (acc 0)) 
    (cond 
     ((null? alist) acc) 
     ((null? (cdr alist)) (+ acc (car alist))) 
     (else (helper (cddr alist) (+ acc (car alist))))))) 
関連する問題