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

How do i find Fibonacci numbers in 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 是调用 fib-iter 的主要过程,它通过迭代完成实际工作。请注意,count 用于控制我们想要的迭代次数,而 ab 用于存储 n-1 和 [=17 的斐波那契数列结果=] 分别。 (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中并被返回。