如何在Scheme中遍历到内部列表?
我正在写一个程序,计算给定列表中的零数。此列表可以有另一个嵌套列表。 我提出的算法非常简单:如何在Scheme中遍历到内部列表?,scheme,Scheme,我正在写一个程序,计算给定列表中的零数。此列表可以有另一个嵌套列表。 我提出的算法非常简单: 如果当前列表为空,则返回0 如果当前列表是另一个列表,则调用子程序在此列表中计数零 否则,继续遍历父列表,如果有,则计数为零 然而,我总是得到一个错误说 =: expects type <number> as 2nd argument, given: quote; other arguments were: 0 谢谢,就其本身而言,您不需要这样的助手方法。如果汽车是一个列表,co
- 如果当前列表为空,则返回0
- 如果当前列表是另一个列表,则调用子程序在此列表中计数零李>
- 否则,继续遍历父列表,如果有,则计数为零
=: expects type <number> as 2nd argument, given: quote; other arguments were: 0
谢谢,就其本身而言,您不需要这样的助手方法。如果汽车是一个列表,countzeroes方法可以递归地调用汽车本身 我会选择这样的
(define (count-zeroes lst)
(cond
((null? lst) 0)
((list? (car lst)) (+ (count-zeroes (car lst)) (count-zeroes (cdr lst))))
((equal? (car lst) 0) (+ 1 (count-zeroes (cdr lst))))
(else (count-zeroes (cdr lst)))
)
)
我已经有一段时间没有练习这个计划了,但是: A) 我不认为
cddr
是(+(helper(car-lst))(count zero(cddr-lst)))
中的正确程序-它应该是cdr
B) 您不需要第二个helper函数-您应该能够调用(count zeroes car lst)
很好,因为此时您正在传递一个列表,该列表将以与其父列表相同的方式拆分
所以争用的行是
(+(计数零(carlst))(计数零(cdrlst)))
非常感谢。但是你能告诉我哪里出错了吗?由于我在练习列表,我更关心的是错误,而不是真正的解决方案。我认为问题在于,您的列表被定义为“(01 2 0”(1 0 0)),而您所需要的只是“(01 2 0(1 0 0))。通常情况下,列表中不需要多个引号。啊,我想可能是您使用了=而不是equal?。当你调用(=0(car-lst))时,如果(car-lst)不是一个数字,你就会得到这个错误,因为=需要两个数字作为参数。非常感谢。这就是我一直在寻找的答案;)!谢谢你指出这一点。事实上,我意识到了这个错误(cdr而不是cddr)。
(define (count-zeroes lst)
(cond
((null? lst) 0)
((list? (car lst)) (+ (count-zeroes (car lst)) (count-zeroes (cdr lst))))
((equal? (car lst) 0) (+ 1 (count-zeroes (cdr lst))))
(else (count-zeroes (cdr lst)))
)
)