让我们看一下这段代码:
;; 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 的inside 中定义的。没有理由不能将这两个定义分开,不过,进入:
(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 ...) 表示您正在使用参数 bar1、bar2、... 调用函数 frob。所以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 会使用b、c 递归调用自身。 (+ c (* 2 b) (* 3 a)) 和 (- count 1) 以及递归调用返回的值被返回。根据上面对 Lisp 语法的描述,你应该可以看出 (+ c (* 2 b) (* 3 a)) 只是数学表达式 c + 2b + 3a,而 (- count 1) 只是 count-1 .
我想,关于这一切的最棘手的部分是知道if 接受三个参数:第一个是测试表达式;第二个是“then”部分,也称为consequent;第三个是“else”部分,也称为alternative。与 if 仅用于有条件地执行某些语句的其他一些语言不同,(if ...) 在 Lisp 中返回一个 值,该值要么是结果的值,要么是替代的值,取决于测试的值是真还是假。
有了这个描述,你应该可以用你熟悉的任何编程语言写出对应的东西。
当然,一旦你理解了所有这些,你最好阅读一些Chris Rathman's translation of SICP code into 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)