2016-02-01 87 views
0

我是Scheme的新手,我已經花了大約一週的時間了。頂級列表中所有數字的總和

編寫一個Lisp函數列表,其中包含一個列表並返回列表中所有數字之和的頂級函數。因此, (sumlist'(1 2(3)(4a)nil b 5))應該返回1 + 2 + 5 = 8。數字3和4不在頂層。使用數字?檢查的事情是一個數字。」

這是我到目前爲止,它可以識別的東西是否是一個數字或沒有,但我不能得到它僅加起來的數字頂級

(define (sumlist lst) 
    (cond ((null? lst) 0) 
     ((number? lst) lst) 
     ((list? lst) 
     (+ (sumlist (car lst)) (sumlist (cdr lst)))) 
     (#t 0))) 
; no values returned 
> (sumlist '(1 2 (3) (4 a) nil b 5)) 
15 

任何幫助表示讚賞

編輯:。。無論絕地的和丹尼爾的回答工作,謝謝兩位非常

+2

如果您只關心頂層,則不需要遞歸到「(汽車1)」。 – Barmar

回答

2
(define (sumlist lst) 
(cond ((null? lst) 0) ;; list is empty, we're done ;; 
    ((number? (car lst)) (+ (car lst) (sumlist (cdr lst)))) ;; the first item is a number, so we add it to the rest 
    (else (sumlist (cdr lst))) ;; the first item was not a number, we just check the rest of the list 
)) 
3

我認爲這可能是一個有點更簡單:

(define (sumlist lst) 
    (cond 
     ((null? lst) 0) 
     ((number? (car lst)) (+ (car lst) (sumlist (cdr lst)))) 
     (else (sumlist (cdr lst))))) 

既然你只關心一個元素是否是數字,那麼你只有三種情況。

相關問題