方案定义功能

时间:2013-03-16 21:55:24

标签: scheme definition

我正试图想出一种在计划中只添加一定数量的正整数的方法,但我无法为我的生活找到一种方法。我试图使用递归。

这是我到目前为止所做的:

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

2 个答案:

答案 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