いくつかのケースについて考えてみましょう。
1)(sumOdd 5)は何を返す必要がありますか?さて、それは5 + 3 + 1 = 9を返す必要があります。2)(sumOdd 6)は何を返す必要がありますか?まあ、それはまた5 + 3 + 1=9を返します。
これで、このアルゴリズムをさまざまな方法で記述できますが、これについて考えることにした1つの方法があります。
nから始まり、カウントダウンする再帰関数を記述します。nが奇数の場合、現在の合計にnを追加してから、2ずつカウントダウンします。なぜ2カウントダウンするのですか?nが奇数の場合、n-2も奇数であるためです。それ以外の場合、nが偶数の場合、何も追加しません。ただし、奇数になるように、必ず繰り返しを繰り返したいと思います。偶数からカウントダウンして、次の奇数に到達するにはどうすればよいですか?1を引きます。これを行い、nが0未満になるまでカウントダウンします。そのときは現在の合計に何も追加したくないので、0を返します。そのアルゴリズムは次のようになります。
(define sumOdd
(lambda (n)
(cond ((<= n 0) 0)
((odd? n) (+ n (sumOdd (- n 2))))
(else (sumOdd (- n 1))))))
それがあなたを助けるなら、これはわずかに異なるアルゴリズムのより明確な例です:
(define sumOdd
(lambda (n)
(cond ((<= n 0) 0)
((odd? n) (+ n (sumOdd (- n 1))))
((even? n) (+ 0 (sumOdd (- n 1))))))) ; note that (even? n) can be replaced by `else' (if its not odd, it is even), and that (+ 0 ..) can also be left out
編集:
問題が少し変わったことがわかります。最初のN個の正の奇数の整数を合計するには、いくつかのオプションがあります。
最初のオプション:数学!
(define sumOdd (lambda (n) (* n n)))
2番目のオプション:再帰。これを達成する方法はたくさんあります。たとえば、2 * nのリストを生成し、上記の手順を使用できます。