我是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 ()
谢谢,
答案 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)当它在一个空列表上递归调用时,“成功触底”。