我正在读取SICP的Tree Recursion,其中fib
是通过线性递归计算的。
我们还可以制定一个迭代过程来计算斐波那契数。这个想法是使用一对整数a和b,初始化为Fib(1)= 1和Fib(0)= 0,并重复应用同时转换
不难证明,在应用了此变换后,[[n时间,a和b分别等于Fib(n + 1)和Fib(n)。因此,我们可以使用以下过程来迭代计算斐波那契数]
(用Emacs Lisp替代Scheme进行重写]
,这很难使我全神贯注。找到#+begin_src emacs-lisp :session sicp (defun fib-iter (a b count) (if (= count 0) b (fib-iter (+ a b) a (- count 1)))) (defun fib (n) (fib-iter 1 0 n)) (fib 4) #+end_src
“设置
a + b = a
和b = a
”
fib
的一般想法很简单:假设完成的斐波那契数表,通过从X
到0
的逐步跳转,在表中搜索X
。
解决方案几乎不直观。
合理地设置a + b = b
,a = b
:
(defun fib-iter (a b count)
(if (= count 0)
a
(fib-iter b (+ a b) (- count 1))
)
)
(defun fib(n)
(fib-iter 0 1 n))
因此,作者的设置似乎不只是反直觉地将b
放在没有特殊目的的头部中。
但是,我当然可以肯定,SICP值得深入研究。
我缺少哪些关键点?为什么设置a + b = a
而不是a + b = b
?
我正在阅读SICP的树递归,其中fib是通过线性递归计算的。我们还可以制定一个计算斐波纳契数的迭代过程。这个想法是使用一对...
fib-iter
的参数顺序不是您想的那样。答案是,函数参数的顺序通常只是任意和/或常规的:这是编写函数的人做出的选择。除了阅读或编写代码的人之外,其他任何人都没有关系:这是一种风格选择。 fib
定义为并行分配