用于计算列表中的原子元素的方案函数

时间:2013-12-13 19:25:54

标签: list recursion scheme

我正在尝试在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)))

错误出现在第4行:

(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

1 个答案:

答案 0 :(得分: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))))))

除此之外,代码还可以。只是一个小建议:不要在一个单独的行中括起括号,最后将它们全部关闭。另请注意,您可以将list?替换为pair?(或cons?,具体取决于您的翻译中哪个可用)。如果值是列表,这比测试更便宜。