我正在尝试在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
答案 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?
,具体取决于您的翻译中哪个可用)。如果值是列表,这比测试更便宜。