编程求值斐波那契数列f(n),是面试中,非常常见的题目。
什么是斐波那契数列?
斐波那契数列是这样一个数列,它满足:
f(0) = 0;
f(1) = 1;
f(n) = f(n-1) + f(n-2) (当n>=2时)
到底有几种方法,这些思路里蕴含的优化思路究竟是怎么样的,今天和大家聊一聊。
一、递归法
伪代码:
uint32_t f(uint32_t n){
if(n==0) return 0;
if(n==1) return 1;
return f(n-1)+f(n-2);
}
思路:这是一个递归的代码,非常清晰,直接把斐波那契数列的定义翻译成了代码。
例如:
假设要求f(5)
f(5) = f(4) + f(3);
于是会递归计算f(4)和f(3);
接着要求f(4)
f(4) = f(3)+ f(2);
于是会递归计算f(3)和f(2);
可以看到,计算f(5)和f(4)中都要计算f(3),但这两次f(3)会重复计算,这就是递归的最大问题,对于同一个f(a),不能复用。
计算一个f(n)到底需要有多少次递归调用呢?
我们可以在代码里加一个计数验证一下。
伪代码:
static uint32_t count=0; // 加一个全局变量计数
uint32_t f(uint32_t n){
count++; // 递归一次,计数加一
if(n==0) return 0;
if(n==1) return 1;
return f(n-1)+f(n-2);
}
实验的结果:
f(5) count = 15
f(10) count = 177
f(15) count = 1K+
f(20) count = 2W+
f