如何计算列表中的零个数?

时间:2011-04-20 15:25:21

标签: scheme

我是Scheme的新手,所以有人能给我举个例子吗? Scheme中没有局部变量,因此如何跟踪遇到的零的数量。

我试过

#lang scheme
(define zeroes
  (lambda (ll)
    (cond ((null? ll) 
           0)
          (else (= 0 (car ll))))
    (zeroes (cdr ll))
  )
)

但是编译器抱怨道:

cdr: expects argument of type <pair>; given ()

谢谢,

3 个答案:

答案 0 :(得分:3)

这是我的解决方案(因为OP已经发布了他们的解决方案):

(define (count-zeroes lst)
  (let loop ((lst lst)
             (count 0))
    (cond ((null? lst) count)
          ((zero? (car lst)) (loop (cdr lst) (+ count 1)))
          (else (loop (cdr lst) count)))))

当然,如果不讨论fold,通常会将列表“汇总”到一个对象(就像我们为这个问题所做的那样)时,不能认为对这个主题的处理是完整的:

(define (count-zeroes lst)
  (fold (lambda (elem count)
          (if (zero? elem) (+ count 1) count))
        0 lst))

答案 1 :(得分:2)

刚刚找到了解决方案,

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

答案 2 :(得分:1)

我现在暂时保持这种状态。

你的功能是做两件事。首先,如果其参数是空列表,则计算0;如果参数是以0开头的列表,则计算#t或#f。然后它抛出结果并在列表的其余部分递归调用自己。

你将不得不做两件事来完成这项工作:1)以某种方式结合各个零测试的结果(对于思考实验,查看你的代码;如果是,它将如何返回值2列表有两个零?); 2)当它在一个空列表上递归调用时,“成功触底”。