Scheme / Simple Recursion问题

时间:2012-03-27 11:53:32

标签: scheme

Concrete Abstractions 中,有一个递归的例子:

(define subtract-the-first (lambda (n)
                             (if (= n 0) 0
                                 (- (subtract-the-first (- n 1)) n))))

我明白了。例如,如果n = 3,则此函数的计算结果为: (- (+ (+ (+ 1) 2) 3)) - > -6

然而,在后续的一个例子中,我们应该解释为什么不可能切换操作顺序。例如,让我们来看看:

(define subtract-the-first2 (lambda (n)
                             (if (= n 0) 0
                                 (- n (subtract-the-first2 (- n 1))))))

如果我打电话(减去第一个4),结果是2.但是,我不太了解评价。显然,我在这里犯了一个错误,因为看到这个: (- 4 (+ 3 (+ 2 (+ 1))) ),等于(- 4 6),因此评估为-2。

我很欣赏任何指示,因为我已经敲了半个小时左右撞到了墙上......

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以通过添加一些semiquoteunquote来检查此功能的评估:

(define subtract-the-first2 (lambda (n)
                              (if (= n 0) 0
                                `(- ,n ,(subtract-the-first2 (- n 1))))))

然后评估:

> (subtract-the-first2 4)
(- 4 (- 3 (- 2 (- 1 0))))

评估结果为2。 (我没看到你在哪里获得了优势......)