2013-12-13 120 views
1

我正試圖在Scheme(LISP)中編寫一個簡單的遞歸定義。計劃函數來計算列表中的原子元素

目標是計算列表中原子元素的數量,並遞歸計算內部列表原子。

例如:

(num_items '((a b) c d)) 

應返回:

4 

因爲"a""b""c",和"d"是在列表/子列表的四個原子元素。

到目前爲止我的代碼如下:

(define (num_items X) 
(cond 
    ((null? X) 0) 
    (list? (car X) (+ (num_items(car X)) (num_items(cdr X)))) 
    (else (+ 1 (num_items(cdr X)))) 
)) 

(display(num_items '((a b) c d))) 

將引發錯誤四號線:

(list? (car X) (+ (num_items(car X)) (num_items(cdr X)))) 

據我所知道的,(num_items(car X))遞歸的除了似乎導致錯誤。如果我有一個1替換線的一部分,例如獲得:

(list? (car X) (+ 1 (num_items(cdr X)))) 

然後代碼編譯和運行,但隨後它並沒有解決問題。

我正在使用Compile Online來測試/運行我的代碼。它拋出的錯誤是:

$gosh main.scheme 

gosh: "error": pair required, but got a 

回答

2

一對括號在第四行的丟失,試試這個:

(define (num_items X) 
    (cond 
    ((null? X) 0) 
    ((list? (car X)) (+ (num_items (car X)) (num_items (cdr X)))) 
    (else (+ 1 (num_items (cdr X)))))) 

其他的代碼是好的。只是一個小小的建議:不要在一個單獨的行中關閉圓括號,最後關閉它們。此外,請注意,您可以用pair?(或cons?,取決於解釋器中的哪一個可用)替換list?。如果值是一個列表,這比測試便宜。