【发布时间】:2014-11-18 16:23:36
【问题描述】:
我正在处理Structure and Interpretation of Computer Programs 并有一个关于练习 1.10 的问题,它使用阿克曼函数定义为
(define (A x y)
(cond ((= y 0) 0)
((= x 0) (* 2 y))
((= y 1) 2)
(else (A (- x 1)
(A x (- y 1))))))
确定表达式(A 1 10)的值。
现在,我知道答案应该是 (A 1 10) = 2^10 = 1024,但是在进行计算时,我得到以下信息:
(A 1 10)
(A (- 1 1) (A 1 (- 10 1)))
(A 0 (A 1 9))
(A 0 (A 0 (A 1 8)))
...
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0(A 0 (A 0 (A 0(A 0 (A 0 (A 0 ( A 0 0)))))))))))))
现在,按照我的理解,Scheme 将首先评估最深的表达式,即最右边的 (A 0 0)。这具有值0,因为函数的第一个条件满足(= y 0)。下一步也会发生同样的情况,我们最终会减少所有括号,直到我们最终得到最后一个 (A 0 0),由于类似的原因,它也将具有值 0。现在,我知道最后一行应该是这样的
(*2 (*2 (*2 (*2 (*2 (*2 (*2 (*2 (*2 (*2 (*2 (A 0 0)))))))))))))
那么,如果所有这些都是正确的,为什么最后一个(A 0 0) 产生2 而不是0?或者,更一般地说,你能发现我推理中的错误在哪里吗?我很确定它要么与递归调用的评估过程有关,要么与条件语句的评估方式有关。
已解决: 正如leppie 所指出的,首先评估(= y 1),在到达(A 0 0) 之前将2 作为(A 0 1) 的值
【问题讨论】:
-
你有一个额外的步骤,其中 y = 1,它产生 2(我认为)
-
天哪。我完全错过了。谢谢!
标签: scheme evaluation sicp