如何遍历Scheme中的内部列表?

时间:2011-04-24 03:15:11

标签: scheme

我正在编写一个计算给定列表中零的数量的过程。此列表可能有另一个嵌套列表。 我提出的算法非常简单:

  • 如果当前列表为null,则返回0
  • 如果当前列表是另一个列表,请调用子程序以在此列表中计算零。
  • 否则继续遍历父列表并计算零(如果有)。

但是,我总是得到错误说,

 =: expects type <number> as 2nd argument, given: quote; other arguments were: 0  

我不知道这是怎么回事。有什么想法吗?

我的尝试是,

(define (helper lst)    
  (cond ((null? lst) 0)
        ((= 0 (car lst)) (+ 1 (helper (cdr lst))))
        (else (+ 0 (helper (cdr lst))))))

(define (count-zeroes lst)
  (cond 
    ((null? lst) 0)
    (else 
      (if (list? (car lst)) 
          (+ (helper (car lst)) (count-zeroes (cdr lst)))
          (if (= 0 (car lst)) 
              (+ 1 (count-zeroes (cdr lst)))
              (+ 0 (count-zeroes (cdr lst))))))))

(define ll '(0 1 2 0 '(1 0 0)))

(count-zeroes ll)

谢谢,

2 个答案:

答案 0 :(得分:2)

你本身并不需要像这样的辅助方法。如果汽车是一个列表,则count-zeroes方法可以在汽车上递归调用自己。

我会选择这样的东西

(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)))
   )
 )

答案 1 :(得分:1)

我练习计划已经有一段时间但是:

A)我不认为cddr(+ (helper (car lst)) (count-zeroes (cddr lst)))中的正确程序 - 它应该只是cdr。

B)你不需要第二个辅助函数 - 你应该可以正常调用(count-zeroes car lst),因为那时你传递的一个列表将被拆分,就像它的父级一样

因此,争用中的行将是(+ (count-zeroes (car lst)) (count-zeroes (cdr lst)))