2012-02-13 7 views
3
#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を見ると、答えは等しくありません。

答えて

2

あなたの答えは次のようになります。 - :それはされている必要があります

[ (eqv? b e) vector-ref V b] 

[ (eqv? b e) (vector-ref V b) ] 
(define (vectorSum V b e) 
    (cond ((eqv? b e) 
     (vector-ref V b)) 
     ((> b e) 
     (eopl:error 'partialVectorSum "starting index must be smaller than or equal to the end index")) 
     (else (+ (vector-ref V b) (vectorSum V (+ b 1) e))))) 

は、それは単純なミスだったあなたは、この行に括弧のカップルを忘れてしまいました

これらの括弧がない場合は、実際にはという手順を呼び出すことはできません。あなたはいくつかのシンボルをリストしていて、最後のシンボルを返すでしょう。この場合はbです。 elseの場合と同じように、常に括弧内にプロシージャコールとその引数を囲むことを忘れないでください。

+0

したがって、主な原因は実際には最初の条件のvector-refの周りにかっこがないことでした。それはどのように問題を引き起こしますか?これをどのようにトレースできますか?どうもありがとうございました。 – CppLearner

+1

これらのカッコがなければ、実際には 'vector-ref'手続きを呼び出すのではなく、いくつかのシンボルをリストし、最後のシンボルを' b'で返します。どのようにそれをトレースするには?私は、この種のエラー(目視検査に加えて)を検出する方法を考えることができません。ちょうどあなたが 'else'パートで行ったように、括弧の間に手続き呼び出しとその引数を囲むことを忘れないでください。 –

+0

おかげさまでオスカー!ニースキャッチ:) – CppLearner

3

再帰がどのように展開されるかについての理解は正しいです。あなたの問題は、最初のケースでvector-refへのコールをカッコで括弧に入れることを忘れたことです。あなたが書いた方法vector-ref V bは3つの独立した式として解釈されます。最後のもの(b)が式の値です。あなたの例ではbが3なので、1 + 1 + 1 + 3 = 6となります。

単にかっこを追加して関数呼び出しにするだけで、好きなように動作します。

+0

ああ。今私はそれを得る。なぜ20分盗聴しましたか?それは常にstackoverflowでお尋ねすることは良いです!あなたたち最高! – CppLearner

関連する問題