斐波那契递归详解

什么是斐波那契数列?

在数学上,斐波那契数列是这样定义的:

F0 = 0

F1 = 1

Fn = Fn-1 + Fn-2(n>=2)

假设n=3,那么F3=F2+F1,此时F1是已知的,且值为1,F2未知。

下一步我们继续套用公式算F2,F2=F1+F0,此时F1和F0都是已知的,且值都为0。就可以算出F2=1+0=1。

有了F2,我们就可以算出F3=1+1=2。

我们可以很轻易地推出n=1乃至n>=2的任意一个数:

1,1,2,3,5,8,13,21,34,55,89,…

如果想更多了解斐波那契数列,可以参考维基百科(需科学上网),不推荐使用百度百科(懂得都懂)

斐波那契数列的二叉树表示形式

话不多说,先放图:

n=3规模斐波那契数列

这是n=3时斐波那契数列的二叉树表示形式,观察一下可以看出叶子节点全部都是已知的值(可以理解为递归出口,意思就是“递归迷宫”走到这里就能出去了)。这个递归树怎么理解?实际上有点像动态规划,F3是原问题的规模,把它分解为F2和F1两个规模更小的子问题,再把F2分解为F1和F0。F1可以分解吗?公式的条件给出了答案,n>=2时才可以分解,n=1和n=0时,已经是最小规模的了。

我们再来分析一下这个东西的结点数,我们来算一下这个树的结点有多少,22+1,那么当规模趋向于n时,结点数就是2n指数级别。

剖析递归程序在计算机中的运行过程

我们先来看一下斐波那契数列递归实现的java代码:

1
2
3
4
5
6
7
int fibonacci(int n) {
if(n == 0)
return 0;
if(n == 1)
return 1;
return fibonacci(n-1)+fibonacci(n-2);
}

其实这个过程用上面的二叉树表示图可以很清晰的解释,程序在算这个树的时候在中序遍历这个树,返回值的时候从叶节点开始返回,一直到整棵树的根节点。


斐波那契递归详解
https://llc-zh.github.io/2022/04/29/斐波那契递归详解/
作者
野风掠原
发布于
2022年4月29日
许可协议