Scheme SICP练习1.10:阿克曼的方案评估&x27;s函数

Scheme SICP练习1.10:阿克曼的方案评估&x27;s函数,scheme,evaluation,sicp,Scheme,Evaluation,Sicp,我正在研究练习1.10,其中有一个问题,使用Ackermann的函数定义为 (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)的值 现在,我知道答案应该是(A110)=2^10=1024,但在进行计算时,我得到以下结果: (A 1 10) (A (- 1 1) (A 1

我正在研究练习1.10,其中有一个问题,使用Ackermann的函数定义为

(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)
的值

现在,我知道答案应该是
(A110)=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将首先计算最深的表达式,即最右边的
(A00)
。该值为
0
,因为函数的第一个条件满足
(=y 0)
。下一步也会发生同样的情况,我们最终会减少所有括号,直到最后一个
(a0)
,出于类似的原因,最后一个
0
也将具有值。现在,我知道最后一行应该是

(*2 (*2 (*2 (*2 (*2 (*2 (*2 (*2 (*2 (*2 (*2 (A 0 0)))))))))))))
那么,如果所有这些都是正确的,为什么最后一个
(A00)
产生
2
,而不是
0
?或者,更一般地说,你能指出我推理中的错误在哪里吗?我很确定它要么与递归调用的求值过程有关,要么与条件语句的求值方式有关


已解决:
(=y1)
所述,首先计算
2
作为
(a0 1)
的值,然后再计算
(a0 0)

您永远无法得到

(A 0 0)
扩张继续进行

(A 0 (A 1 9))
(A 0 (A 0 (A 1 8)))
(A 0 (A 0 (A 0 (A 1 7))))
...
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1))))))))))

现在,
(a11)
被计算为
2

,你永远无法得到它

(A 0 0)
扩张继续进行

(A 0 (A 1 9))
(A 0 (A 0 (A 1 8)))
(A 0 (A 0 (A 0 (A 1 7))))
...
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1))))))))))

现在,
(a11)
被计算为
2

,你永远无法得到它

(A 0 0)
扩张继续进行

(A 0 (A 1 9))
(A 0 (A 0 (A 1 8)))
(A 0 (A 0 (A 0 (A 1 7))))
...
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1))))))))))

现在,
(a11)
被计算为
2

,你永远无法得到它

(A 0 0)
扩张继续进行

(A 0 (A 1 9))
(A 0 (A 0 (A 1 8)))
(A 0 (A 0 (A 0 (A 1 7))))
...
(A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 0 (A 1 1))))))))))

现在
(a11)
被计算为
2

你有一个额外的步骤,其中y=1,它产生2(我认为)Oh jeeze。我完全错过了。谢谢你有一个额外的步骤,其中y=1,它产生2(我想)哦,天哪。我完全错过了。谢谢你有一个额外的步骤,其中y=1,它产生2(我想)哦,天哪。我完全错过了。谢谢你有一个额外的步骤,其中y=1,它产生2(我想)哦,天哪。我完全错过了。谢谢