Scheme 方案定义函数

Scheme 方案定义函数,scheme,definition,Scheme,Definition,我正试图想出一种方法,在scheme中只将正整数加到某个数字上,但我一辈子都找不到一种方法。我试图使用递归 这就是我到目前为止所做的: (define sumEven (lambda(n) (cond((> n 0)1) ((even? n) (* (sumEven n (-(* 2 n) 1) 我在想这个电话会有如下效果: (sumEven N)=2 + 4 + ... + 2*N 并输出如下内容: (sumEven 1) ==&g

我正试图想出一种方法,在scheme中只将正整数加到某个数字上,但我一辈子都找不到一种方法。我试图使用递归

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

(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
(define sumEven
  (lambda (n)
    (apply + (build-list (add1 n) (curry * 2)))))
但我不知道如何只添加偶数int而跳过奇数。这可能吗?

你是说这样吗

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

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

2
20
30

请注意,您还可以通过函数实现
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)))))))
另一种选择是使用列表操作,创建一个包含要添加的数字的列表,然后添加这些数字,这与更具功能性的编程风格相一致;例如:

(sumEven 1)  ==> 2
(sumEven 4)  ==> 20
(sumEven 5)  ==> 30
(define sumEven
  (lambda (n)
    (apply + (build-list (add1 n) (curry * 2)))))
无论哪种方式,结果都与预期的一样:

(sumEven 1)
=> 2
(sumEven 4)
=> 20
(sumEven 5)
=> 30

不知道会这么简单,也许我想得太多了谢谢你的帮助谢谢你的提示这将帮助我完成我正在制作的程序