正如现在所写的那样,您的代码只会返回 1 或 0。为了使此过程按预期工作,您需要了解有关方案的两个重要事项:递归调用如何工作,以及赋值如何工作。
任务:
我在方案中写了一个非常深入的赋值分解,但在这种情况下,简短的版本是你没有改变x
你调用时的值(+ x 1)
。如果您想实际更改方案中绑定的值,则必须使用该set!
过程(但在这种情况下您确实不需要这样做)。
递归:
回想一下,递归是当您从自身内部调用过程时。递归解决方案有两个必要元素:空值和归约公式。
在加法或减法的情况下,你的 null 值是 0,对于乘法它是 1,因为cons
它是空列表'()
。
减少公式是您如何将问题分解为更简单的部分,或者如何让问题更接近于每一步的解决。
例子:
(define count-elements
(lambda (lst)
(if (null? lst) 0 ; <-- I'm done? return the null value
(+ 1 (count-elements (cdr lst)))))) ;<-- otherwise +1 and reduce the problem
由于这是家庭作业,我不会为您明确解决这个问题,但您的答案应该与计数元素的形式基本相同,您只需要另一个谓词来确定您是否真的需要添加任何东西。