为什么Scheme中的递归添加错误?

时间:2012-02-13 01:31:05

标签: recursion scheme racket

#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答案是不相等的。

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部分中所做的那样。