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

末尾再帰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 に答える
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 に答える