2012-02-13 2 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)) 

Когда я пробую это, я получаю неправильный результат. В чем проблема?Почему это рекурсивное дополнение неправильно в схеме?

> (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 

Take (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

Ваш ответ должен выглядеть следующим образом:

(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))))) 

Это была простая ошибка - вы забыли пару круглых скобках в этой строке:

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

Он должен был быть:

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

Без этих скобок вы фактически не вызываете процедуру vector-ref, instea d вы перечисляете некоторые символы и возвращаете последний, b в этом случае. Не забудьте всегда окружать вызов процедуры и ее аргументы между скобками, как и в части else.

+0

Таким образом, основной причиной было отсутствие скобки вокруг вектора-ref в первом условии. Как это вызывает проблемы? Как я могу это проследить? Большое спасибо. – CppLearner

+1

Без этих скобок вы фактически не выполняете процедуру _ vector-ref', вместо этого вы указываете некоторые символы и возвращаете окончательный вариант 'b' в этом случае. Как проследить его? Я не могу придумать способ обнаружения такого рода ошибок (помимо визуального контроля), просто не забудьте окружить вызов процедуры и его аргументы между скобками, как и в части 'else'. –

+0

Спасибо Оскар! Nice catch :) – CppLearner

3

Ваше понимание того, как происходит рекурсия, правильная. Ваша проблема заключается в том, что вы забыли в скобках позвонить в vector-ref в первом случае. То, как вы его написали vector-ref V b, интерпретируется как три независимых выражения. Последним из них (b) является значение выражения. Так как в вашем примере b равно 3, вы получите 1 + 1 + 1 + 3 = 6.

Просто добавьте круглые скобки, чтобы сделать это вызовом функции, и он будет работать так, как вы этого хотите.

+0

Ahh. Теперь я понимаю. Послушал меня, что 20 минут прослушивают почему. Всегда полезно спрашивать о stackoverflow! Вы, ребята, рок! – CppLearner

Смежные вопросы