2016-10-24 3 views
0

Я пишу функцию, которая дает сумму всего числа в списке, пренебрегая словами или алфавитами.Схема сумма чисел в списке

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

(глубокая сумма (a 2 (b (1 c)) 3)) =>; должен возвращать 6.

но я получаю 5. что означает мой код не достигает во внутреннем цикле

ответ

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

Если вы хотите, чтобы проверить вложенные списки, вы должны иметь еще одно условие, которое проверяет, если элемент списка , а затем вызывать результирующий список сумм.

Добавление этой строки ниже условия null? должно сделать это.

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

Смежные вопросы