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

卡列布
(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的书中获得了这段代码,但我很困惑。我完全理解斐波那契算法的思想,但是这段代码使我陷入困境。最后一行到底是什么?作为一个答案,如果我试图罚款fib(5),我应该得到0,1,1,2,3,5,但逻辑似乎很奇怪。

奥斯卡·洛佩兹(Oscar Lopez)

该过程将斐波纳契数列实现为一个迭代过程。在这种情况下,fib是调用的主要过程,该过程fib-iter通过迭代来完成实际工作。请注意,count是用来控制我们想要的迭代次数,而ab用于存储斐波纳契数列的结果n-1n-2分别。这行代码(fib-iter (+ a b) a (- count 1))将迭代推进到下一个值。

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

为了进行比较,让我们看看使用更常规的语法(Python的)看起来相同的过程如何:

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程序简单地迭代的范围由受控值的count变量,分配ab该系列中的下一个值,直到迭代次数完成; 此时,结果已输入b并返回。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章