【问题标题】:Racket variable memory球拍变量记忆
【发布时间】:2017-11-06 04:27:19
【问题描述】:

鉴于此代码:

(define (wrapper n)
  (define (sum-ints)
    (set! n (+ n 1))
      (display n)(newline)
      (if (= n 3)
        n
        (+ n (sum-ints))))
  (sum-ints))

使用 n = 0

调用此过程
(wrapper 0) => 
  1
  2
  3
  6

我曾期望该过程将 n 增加到 3 的值,然后当它返回时,将 3 添加到 3 到 3 以获得 3 3 3 9 的输出。

内部过程是否存储 n 的卷影副本?

【问题讨论】:

    标签: scheme racket r5rs


    【解决方案1】:

    哎呀,突变很讨厌。这里的问题是“加号”是从左到右评估的。具体来说,考虑n=2的情况。表达式 (+ n (sum-ints)) 从左到右计算。首先,标识符+ 计算为加号函数。然后n求值为2。然后递归调用,结果为3。然后,我们将它们相加,结果为5。

    您会在 Java 或任何其他定义子表达式从左到右求值的语言中看到相同的结果。

    解决这个特殊问题,恕我直言:不要使用突变。它只需要 大约 10% 的情况下人们想要使用它。

    【讨论】:

    • 非常感谢您的详细解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2015-07-28
    相关资源
    最近更新 更多