【问题标题】:SICP exercise 1.10: Scheme evaluation of Ackermann's functionSICP 练习 1.10:Ackermann 函数的方案评估
【发布时间】: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


【解决方案1】:

你永远无法做到

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

现在(A 1 1) 被评估为2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2012-07-05
    • 2011-11-05
    • 2017-02-03
    • 2010-12-26
    • 2012-12-15
    • 2021-05-23
    相关资源
    最近更新 更多