不了解SICP中的计划程序

时间:2014-06-04 13:28:07

标签: syntax scheme sicp

我正在通过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))))

非常感谢任何照明

1 个答案:

答案 0 :(得分:6)

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

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

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

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

实际程序结束时的next部分只是提供next b函数)和next数字< / em>)函数递归调用的参数,这是在最后一行传递的内容:

b

另请注意, (sum term (next a) next b) ^ ^ ^ ^ ^ function call "term" function next number "next" function upper limit 实际上(next a)过程应用于next参数,并将该应用程序的结果传递给递归 - 在事实上,这是调用之间唯一的变化值,并且它有效地推进了递归,直到a变为假。这与我们传递(> a b)倒数第二个参数时发生的事情不同,后者是函数本身,而不是应用它的结果。例如,您可以通过next程序调用{​​{1}}和sum之间的所有数字来添加:

1