#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
拿(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答案是不相等的。
答案 0 :(得分:3)
您对递归如何展开的理解是正确的。您的问题是,在第一种情况下,您忘记将对vector-ref
的呼叫加以括号。你写它的方式vector-ref V b
被解释为三个独立的表达式。最后一个(b
)是表达式的值。因此,在您的示例中,b
为3,您将获得1 + 1 + 1 + 3 = 6
。
只需添加括号即可使其成为函数调用,它将按您的意愿运行。
答案 1 :(得分: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
程序,而是在这种情况下列出一些符号并返回最后一个符号b
。请记住,始终在括号内包围过程调用及其参数,就像在else
部分中所做的那样。