我如何在Scheme中找到斐波纳契数?

时间:2016-06-06 14:46:06

标签: scheme lisp

(define (fib n)
  (fib-iter 1 0 n))
(define (fib-iter a b count)
  (if (= count 0)
    b
    (fib-iter (+ a b) a (- count 1))))

我从SICP书中获取了这段代码,但我很困惑。 我完全理解Fibonacci算法的想法,但这段代码让我感到困惑。 最后一行究竟是什么? 作为一个答案,如果我试图罚款一个fib(5),我应该得到0,1,1,2,3,5,但逻辑似乎很奇怪。

1 个答案:

答案 0 :(得分:2)

该程序将Fibonacci系列实现为迭代过程。在这种情况下,fib是调用fib-iter的主要过程,它通过迭代完成实际工作。请注意,count用于控制我们想要的迭代次数,而ab用于存储n-1和{{1}的斐波那契数列的结果}} 分别。第n-2行正在将迭代推进到下一个值。

请花点时间阅读本书中关于迭代与递归过程的内容,同时阅读尾递归 - 这些是您需要掌握的概念,以便真正理解示例中发生的事情。

为了进行比较,让我们看一下使用更传统的语法(Python)的相同程序的外观:

(fib-iter (+ a b) a (- count 1))

如您所见,def fib(n): return fib_iter(1, 0, n) def fib_iter(a, b, count): while count != 0: # same as asking `(if (= count 0) ...)` a, b = a + b, a # same as passing `(+ a b) a` to recursive call count -= 1 # same as `(- count 1)` return b # same as returning `b` at end of recursion 过程只是迭代fib_iter变量控制的一系列值,将counta分配给下一个值系列,直到完成多次迭代;此时结果位于b并返回。