我正在通过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))))
非常感谢任何照明
答案 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