斐波那契的SICP解决方案,设置`a + b = a`,为什么不设置'a + b = b`?

问题描述 投票:1回答:2

我正在读取SICP的Tree Recursion,其中fib是通过线性递归计算的。

我们还可以制定一个迭代过程来计算斐波那契数。这个想法是使用一对整数ab,初始化为Fib(1)= 1Fib(0)= 0,并重复应用同时转换

enter image description here

不难证明,在应用了此变换后,[[n时间,ab分别等于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 = ab = a

,这很难使我全神贯注。找到fib的一般想法很简单:

假设完成的斐波那契数表,通过从X0的逐步跳转,在表中搜索X

解决方案几乎不直观。

合理地设置a + b = ba = 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是通过线性递归计算的。我们还可以制定一个计算斐波纳契数的迭代过程。这个想法是使用一对...

algorithm lisp elisp fibonacci sicp
2个回答
2
投票
据我所知,您的问题是您不喜欢fib-iter的参数顺序不是您想的那样。答案是,函数参数的顺序通常只是任意和/或常规的:这是编写函数的人做出的选择。除了阅读或编写代码的人之外,其他任何人都没有关系:这是一种风格选择。 fib定义为

2
投票
重复以命令形式给出。例如,在Common Lisp中,我们可以在循环体中使用

并行分配

© www.soinside.com 2019 - 2024. All rights reserved.