#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 ответы не равны.
Таким образом, основной причиной было отсутствие скобки вокруг вектора-ref в первом условии. Как это вызывает проблемы? Как я могу это проследить? Большое спасибо. – CppLearner
Без этих скобок вы фактически не выполняете процедуру _ vector-ref', вместо этого вы указываете некоторые символы и возвращаете окончательный вариант 'b' в этом случае. Как проследить его? Я не могу придумать способ обнаружения такого рода ошибок (помимо визуального контроля), просто не забудьте окружить вызов процедуры и его аргументы между скобками, как и в части 'else'. –
Спасибо Оскар! Nice catch :) – CppLearner