方案中Fibonacci尾递归的解释?

时间:2014-09-28 21:34:51

标签: scheme fibonacci

我一直在尝试理解Scheme中的尾递归,并且我很难理解在使用Fibonacci的尾递归的示例中发生了什么......

如果这是尾递归的代码,或迭代的Fibonacci:

(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))))

除了这里,我基本上能理解每一行发生的事情:

(fib-iter 1 0 n))

这一行实际发生了什么?我无法在任何地方找到解释。我是Scheme的新手,到目前为止语法很混乱。

或者任何人都可以解释每一行中发生的事情?这是我的基本理解,但我不确定我是否正确:

(define (fib n) ;;define the function fib and variable n
  (fib-iter 1 0 n)) ;;?? no idea

(define (fib-iter a b count) ;;define function fib-iter, variables a, b and count
  (if (= count 0) ;;if the count is equal to 0, 
    b ;;return b
    (fib-iter (+ a b) a (- count 1)))) ;;recursively calling function fib-iter with 3 parameters (a+b), a and (count - 1)

谢谢!

2 个答案:

答案 0 :(得分:4)

fib程序中有一个拼写错误(缺少左括号),应定义如下:

(define (fib n)
  (fib-iter 1 0 n))

话虽如此,迭代fib过程使用一个名为fib-iter的帮助器来实现实际的迭代。这一行:

(fib-iter 1 0 n)

第一次只是打电话给帮手。如您所知,斐波纳契数列以0的值n=01的{​​{1}}开头,这正是我们所依据的值作为参数传递,以启动迭代循环,以及n=1的值,这是我们在停止之前想要做的迭代次数。

从那时起,n将包含a的斐波那契值,n-1将包含b的斐波那契值,以及每个后续步骤迭代会相应地更新n-2a变量,直到b为零,此时我们停止并返回结果。

如果我们以命令式方式编写相同的算法,可能更容易想象发生了什么。这是Python中使用显式循环结构和相同变量名称的一个示例。这相当于Scheme实现:

n

答案 1 :(得分:2)

您的代码中存在错误; fib应该是一个程序:

(define (fib n)
  (fib-iter 1 0 n))

它的作用是fib-iter,其初始值为a(= 1),b(= 0)和count(=你想要的斐波纳契数,这是形式参数nfib)。

添加打印声明'到fib-iter显示会发生什么,在此示例中为(fib 7)

a=1  b=0  count=7 ; initial values as given by `fib`
a=1  b=1  count=6
a=2  b=1  count=5
a=3  b=2  count=4
a=5  b=3  count=3
a=8  b=5  count=2
a=13  b=8  count=1
a=21  b=13  count=0
13 ; the returned value for `(fib 7)`