让我们看一下这段代码:
;; ex 1.11. Iterative implementation
(define (f n)
(define (iter a b c count)
(if (= count 0)
a
(iter b c (+ c (* 2 b) (* 3 a)) (- count 1))))
(iter 0 1 2 n))
这里首先要注意的是定义了两个函数。一个是f
,另一个是iter
。 iter
是一个辅助函数,并且仅供f
(因为它是在内部定义的f
。没有理由不能将这两个定义分开为:
(define (iter a b c count)
(if (= count 0)
a
(iter b c (+ c (* 2 b) (* 3 a)) (- count 1))))
(define (f n)
(iter 0 1 2 n))
在 Lisps 中,语法(frob bar1 bar2 ...)
意味着您正在frob
使用参数调用函数bar1
, bar2
, ...
。所以定义f
(define (f n)
(iter 0 1 2 n))
应该比较清楚。您正在定义一个f
带有单个参数的函数n
,然后您iter
使用四个参数调用该函数0
, , 1
,2
和n
。那么做iter
什么呢?
(define (iter a b c count)
(if (= count 0)
a
(iter b c (+ c (* 2 b) (* 3 a)) (- count 1))))
iter
接受四个参数。首先,它检查是否count
是0
。如果是,则iter
返回a
。否则,使用,iter
递归调用自身。和返回递归调用返回的值。根据上面对 Lisp 语法的描述,你应该可以看出这只是数学表达式c + 2b + 3a,也就是count-1。b
c
(+ c (* 2 b) (* 3 a))
(- count 1)
(+ c (* 2 b) (* 3 a))
(- count 1)
我想,所有这一切中最棘手的部分是知道它if
需要三个参数:第一个是测试表达式;第二个是“then”部分,也称为consequent;第三个是“else”部分,也称为alternative。与其他一些if
仅用于有条件地执行某些语句的语言不同,它在 Lisp 中(if ...)
返回一个值,该值要么是结果的值,要么是替代的值,这取决于测试的值是真还是假.
有了这个描述,您应该能够用您熟悉的任何编程语言编写对应的内容。
当然,一旦你理解了所有这些,你可能会很好地阅读Chris Rathman 将 SICP 代码翻译成 Python 的一些内容,其中包括对练习 1.11 中代码的翻译:
# Exercise 1.11
def f(n):
if n < 3:
return n
else:
return f(n-1) + 2*f(n-2) + 3*f(n-3)
def f_iter(a, b, c, count):
if count == 0:
return c
else:
return f_iter(a + 2*b + 3*c, a, b, count-1)
def f(n):
return f_iter(2, 1, 0, n)