我正在使用递归编写一个函数,该函数应该在列表中添加交替值。仅编写一些代码以将所有值添加到列表中相对简单,但我正努力仅在列表中添加交替值。如果可能的话,相对于高阶函数,我强烈希望使用递归编写的代码。
我对这个问题的唯一猜测是操纵列表的长度以仅添加列表的交替值,或者可能找到一种仅在列表中添加奇数元素的方法,但是我不知道这是否是偶数可能,甚至可能的话,我也不知道从哪里开始。
到目前为止,这是我的代码
(define (skip-sum L)
(cond
[(empty? L) 0]
[else (+ (first L) (skip-sum (rest L)))]))
这就是结果的样子。如您所见,只对列表中的奇数元素求和,显示仅添加了列表中的交替值。
(check-expect (skip-sum (list 4 6 8)) 12)
(check-expect (skip-sum (list 1 3 5 7 9 11)) 15)
(check-expect (skip-sum (list 2 10 4 12 6 14 8 12 10))30)
例如,在第二个示例中,相加后的交替值为1 + 5 + 9 = 15。
答案 0 :(得分:1)
这是一个可能的递归定义:
(define (skip-sum l)
(cond ((empty? l) 0)
((empty? (cdr l)) (car l))
(else (+ (car l) (skip-sum (cddr l))))))
请注意,有两种情况可以结束递归:当列表为空或仅包含一个元素时。
在递归的情况下,我们简单地将列表的第一个元素与从第三个元素开始调用列表上的函数的结果相加(因此忽略第二个元素)。这样,我们将跳过每个偶数元素并获得正确的总和。