在 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。
我很欣赏任何指示,因为我已经敲了半个小时左右撞到了墙上......
谢谢!
答案 0 :(得分:2)
您可以通过添加一些semiquote
和unquote
来检查此功能的评估:
(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
。 (我没看到你在哪里获得了优势......)