【问题标题】:don't understand scheme procedure in SICP不了解 SICP 中的方案程序
【发布时间】:2014-06-04 13:28:07
【问题描述】:

我正在阅读 SICP 第 1 章“1.3 用高阶公式化抽象” 程序”

我(目前)遇到问题的部分是程序模板(如下所示)通过将其“插槽”转换为形式参数而转换为实际过程(如下所示)。我没有得到的是他们在转换过程结束时得到 next b 的地方(就在右括号之前)?

肯定只是模板中的 b 吗?

不管怎样,这就是模板……

(define (<name> a b)
  (if (> a b)
      0
      (+ (<term> a)
         (<name> (<next> a) b))))

这是参数槽填满后的过程

(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a)
         (sum term (next a) next b))))

非常感谢任何照明

【问题讨论】:

    标签: syntax scheme sicp


    【解决方案1】:

    这里要理解的关键见解是,在 Scheme 中,我们可以像传递数字一样容易地将函数作为 参数 传递给另一个函数。注意模板不完整,应该是:

    (define (<name> <term> a <next> b)
      (if (> a b)
          0
          (+ (<term> a)
             (<name> <term> (<next> a) <next> b))))
    

    从模板到实际过程的转换很简单:

    • &lt;name&gt; 是过程名称的占位符,恰好是sum
    • &lt;term&gt; 是应用于系列中每个术语的过程的占位符,在实际过程中它也称为 term 但它可以有任何其他名称 - 例如,identity 将是一个有用的传递过程沿着
    • &lt;next&gt; 是计算系列中下一个元素的过程的占位符,例如它可以像传递 add1 一样简单,但作者也选择将其称为 next

    实际过程末尾的next b 部分只是提供next(一个函数)和b(一个数字)参数函数的递归调用,这是最后一行传递的内容:

        (sum            term             (next a)     next             b)
         ^              ^                ^            ^                ^
         function call  "term" function  next number  "next" function  upper limit
    

    还要注意(next a) 实际上应用next 过程到a 参数,并将该应用的结果传递给递归 - 事实上,这是唯一的值在调用之间发生变化,并且它有效地推进递归直到(&gt; a b) 变为假。这与倒数第二个参数中发生的情况不同,我们传递next,是函数本身,而不是应用它的结果。例如,下面是调用sum 过程来添加110 之间的所有数字的方法:

    (sum identity 1 add1 10) ; <term> is `identity` and <next> is `add1`
    => 55
    

    【讨论】:

    • "...(next a) 实际上是在应用下一个过程......这与...传递下一个,函数本身..."欢呼老兄。你是王子
    • @user3435279 没问题!如果这个答案对你有帮助,请不要忘记accept它,点击左侧的复选标记;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多