Scheme SICP练习1.10:阿克曼的方案评估&x27;s函数
我正在研究练习1.10,其中有一个问题,使用Ackermann的函数定义为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
(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(我想)哦,天哪。我完全错过了。谢谢