我正试图想出一种在计划中只添加一定数量的正整数的方法,但我无法为我的生活找到一种方法。我试图使用递归。
这是我到目前为止所做的:
(define sumEven
(lambda(n)
(cond((> n 0)1)
((even? n) (* (sumEven n (-(* 2 n) 1)
我在想这个电话会做类似的事情:
(sumEven N)=2 + 4 + ... + 2*N
并输出如下内容:
(sumEven 1) ==> 2
(sumEven 4) ==> 20
(sumEven 5) ==> 30
但我不确定如何添加偶数int并跳过奇数。这甚至可能吗?
答案 0 :(得分:0)
你的意思是这样吗?
(define (sumEven n)
(if (= n 0)
0
(+ (* 2 n) (sumEven (- n 1)))))
(sumEven 1)
(sumEven 4)
(sumEven 5)
2
20
30
答案 1 :(得分:0)
请注意,您还可以通过tail recursive函数实现sumEven
过程,这样做的优点是可以将堆栈空间要求从线性或O(n)减少到常量或O (1)。只要有可能,这是编写递归过程的推荐方法:
(define sumEven
(lambda (n)
(let loop ((n n)
(acc 0))
(cond ((zero? n)
acc)
(else
(loop (sub1 n) (+ (* 2 n) acc)))))))
另一个替代方案,与更多功能编程风格一致,将使用列表操作和higher-order functions来创建包含要添加的数字的列表,然后添加它们;比如像这样:
(define sumEven
(lambda (n)
(apply + (build-list (add1 n) (curry * 2)))))
无论哪种方式,结果都符合预期:
(sumEven 1)
=> 2
(sumEven 4)
=> 20
(sumEven 5)
=> 30