如何在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)))
   )
 )