2016-10-24 21 views
0

リスト内のすべての数字の和に単語やアルファベットを無視した関数を書いています。schemeリスト内の数字の合計

(define (sum-list ls) 
    (cond ((null? ls) 0) 
     ((not (number? (car ls))) (sum-list(cdr ls))) 
     (else (+ (car ls) (sum-list (cdr ls)))) 
     ) 
) 

(deep-sum '(a 2(b(1c))3))=>; 6.

を返す必要がありますが、私はあなたがネストされたリストを確認したい場合は意味私のコードは、内部ループ

答えて

3

、それはより多くのこのように書きます:

(define (deep-sum ls) 
    (cond ((null? ls) 0) 
     ((not (pair? ls))   ; only add atoms 
     (if (number? ls) ls 0))  ; only add numbers 
     (else (+ (deep-sum (car ls)) ; advance recursion on both car and car 
       (deep-sum (cdr ls)))))) 

予想通り今では動作します:

(deep-sum '(a 2 (b (1 c)) 3)) 
=> 6 
0

に達していない、あなたは要素がリストであるかどうかを確認する別の条件を持っている必要があります。5.を取得していますその後、sum-listを再帰的に呼び出します。

この行を追加すると、null?の状態になるはずです。リストのリストをトラバースする方法はありません

((list? (car ls)) (+ (sum-list (car ls)) (sum-list (cdr ls))))

関連する問題