SICP ex 1.10。我们不应该这样解决吗:

时间:2018-08-12 06:40:38

标签: scheme 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)。

这是我的解决方法:

(A 1 10)
(A 0 (A 0 9))
(A 0 (18))
36

现在我知道答案是1024,我在Internet上找到了解决方案,但是我认为将要发生的是x的值将使(A x (- y 1))中的x的值减小时将是减小的值,但是似乎不是并非如此。怎么样 ?按照应用顺序难道不是真的吗? 而且,与递减值1.9能够调用函数时的情况相同。 预先谢谢你。

1 个答案:

答案 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的次幂,或者您可能不是。)