1

我试图想出一种方法,只将正整数添加到方案中的某个数字,但我一生都无法找到一种方法来做到这一点。我试图使用递归。

这是我到目前为止所拥有的:

(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 并跳过奇数。这甚至可能吗?

4

2 回答 2

0

你的意思是这样吗?

(define (sumEven n)
  (if (= n 0)
      0
      (+ (* 2 n) (sumEven (- n 1)))))

(sumEven 1)
(sumEven 4)
(sumEven 5)

2
20
30
于 2013-03-16T22:17:30.943 回答
0

请注意,您还可以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)))))))

另一种选择,与更函数化的编程风格相一致,是使用列表操作和高阶函数来创建一个包含要添加的数字的列表,然后将它们相加;例如像这样:

(define sumEven
  (lambda (n)
    (apply + (build-list (add1 n) (curry * 2)))))

无论哪种方式,结果都符合预期:

(sumEven 1)
=> 2
(sumEven 4)
=> 20
(sumEven 5)
=> 30
于 2013-03-16T23:37:14.580 回答