我正在编写一个计算给定列表中零的数量的过程。此列表可能有另一个嵌套列表。 我提出的算法非常简单:
但是,我总是得到错误说,
=: 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)
谢谢,
答案 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)))