#lang eopl
(define (vectorSum V b e) ; b is starting index, and e is ending index
(cond
[ (eqv? b e) vector-ref V b]
[ (> b e)
(eopl:error 'vectorSum "starting index must be smaller than or equal to the end index")]
[ else (+ (vector-ref V b) (vectorSum V (+ b 1) e))]))
(define A #(1 1 1 1 1))
これを試してみると、私は間違った結果を得ています。ここで何が問題なの?Schemeでこの再帰的な追加が間違っているのはなぜですか?
> (vectorSum A 0 4)
8
> (vectorSum A 0 1)
2
> (vectorSum A 0 3)
6
> (vectorSum A 1 3)
5
> (vectorSum A 1 2)
3
> (vectorSum A 0 1)
2
> (vectorSum A 1 2)
3
テイク(vectorSum A 0 3)私は再帰を拡張したとき、私はそれは
+ 1 + VectorSum (1 3)
+ 1 + VectorSum (2, 3)
+ 1 + VectorSum (3, 3)
+ 1 (I hit the first case, there is no more recursion)
= 4
ことになっていたと思った代わりに、私は6なぜを取得しますか?
ありがとうございました。
0,1と1,2を見ると、答えは等しくありません。
したがって、主な原因は実際には最初の条件のvector-refの周りにかっこがないことでした。それはどのように問題を引き起こしますか?これをどのようにトレースできますか?どうもありがとうございました。 – CppLearner
これらのカッコがなければ、実際には 'vector-ref'手続きを呼び出すのではなく、いくつかのシンボルをリストし、最後のシンボルを' b'で返します。どのようにそれをトレースするには?私は、この種のエラー(目視検査に加えて)を検出する方法を考えることができません。ちょうどあなたが 'else'パートで行ったように、括弧の間に手続き呼び出しとその引数を囲むことを忘れないでください。 –
おかげさまでオスカー!ニースキャッチ:) – CppLearner