我刚刚解决了《计算机程序的结构和解释》这本书,并且对练习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)。
这是我的解决方法:
(A 1 10)
(A 0 (A 0 9))
(A 0 (18))
36
现在我知道答案是1024,我在Internet上找到了解决方案,但是我认为将要发生的是x的值将使(A x (- y 1))
中的x的值减小时将是减小的值,但是似乎不是并非如此。怎么样 ?按照应用顺序难道不是真的吗?
而且,与递减值1.9能够调用函数时的情况相同。
预先谢谢你。
答案 0 :(得分:1)
x
的值不变-直到本书中途引入突变之前,变量的值都不会改变。
按照书中的说明使用替代方法。
可以了
(A 1 10)
[Replace x with 1, y with 10 in (A (- x 1) (A x (- y 1)))]
(A (- 1 1) (A 1 (- 10 1)))
(A 0 (A 1 9))
(* 2 (A 1 9))
[Replace x with 1, y with 9]
(* 2 (A (- 1 1) (A 1 (- 9 1)))))
(* 2 (A 0 (A 1 8))))
(* 2 (* 2 (A 1 8)))
[...]
(* 2 (* 2 (A 0 (A 1 7))))
[...]
(此时您可能会意识到(A 1 K)
是2的K
的次幂,或者您可能不是。)