cond语句的意外行为

时间:2013-11-23 16:39:53

标签: scheme conditional-statements

我需要编写以这种方式工作的函数:如果其参数小于3,则必须返回参数,否则返回f(n-1) + f(n-2) + f(n-3)。该函数必须生成迭代(非递归)过程 现在,我有这个函数的变体:

(define (fi n)
    (define (fiHelper x1 x2 x3 c)
        (cond ((= c 2) x3)
            (else (fiHelper x2 x3 (+ x1 x2 x3) (- c 1)))))
    (cond ((< n 3) n)
        (else fiHelper 0 1 2 n)))

无论我传递的是什么,它总是返回我传入的n,例如,如果我通过10它会返回10,它会返回17如果我通过17等等。我用if语句重写了它,如下所示:

(define (fi n)
    (define (fiHelper x1 x2 x3 c)
        (cond ((= c 2) x3)
            (else (fiHelper x2 x3 (+ x1 x2 x3) (- c 1)))))
    (if (< n 3) 
        n
        (fiHelper 0 1 2 n)))

它按预期工作 - 为n等于230返回10。我无法弄清楚导致此行为的condif之间的区别。

2 个答案:

答案 0 :(得分:2)

您需要(else (fiHelper 0 1 2 n)),而不是(else fiHelper 0 1 2 n)。第一个表达式调用辅助函数;第二个只是评估符号fiHelper, 0, 1, 2,取最后一个符号的值。

答案 1 :(得分:0)

代码中的错误是因为我不容易找到。我在foo fiHelper中插入了一个“(显示”HelferFoo“),然后注意到这个foo从未被调用过。

Georg Fuss