让我们看一下这段代码:
;; 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。bc(+ 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)