目录
介绍
众嗦粥汁,斐波那契数列(Fibonacci sequence),又称黄金分割数列,它是数学家莱昂纳多·斐波那契(Leonardo Fibonacci)发明的,它是这样排列的:
经过一些简单的观察,我们就可以发现它的递归关系式:
C++版代码
代码
有了上一章的递归关系式,我们就能写出一个简单的函数:
#include <iostream>
using namespace std;
long long f(int n){ // 斐波那契数列的增长非常快,n=47时就超出了int的范围,所以用long long
if (n == 1||n == 2) return 1;
return f(n - 1) + f(n - 2);
}
int main(){
int n;
cin >> n;
cout << f(n) << endl;
}
如果你运行就会发现:当 时,程序运行的速度明显变慢了。这是因为此代码的时间复杂度为
那我们究竟该怎么优化呢?答案下一章揭晓。
算法优化
揭晓上一章的答案:经过我们仔细的推敲后就能发现:有些数据是重复算过的!就像这样:
这里我们可以看到: 被算了两次。我们优化就可以抓住这一点。我们可以定义一个数组,把算过的数据都存在这个数组里面,需要的时候在使用它。这里涉及到一个知识点。如果把数组声明为全局变量,这时你的数组的元素个数可以比局部变量开的更加大,而且不用初始化(开发一些项目时还是尽量避开全局变量会比较好)。
我们来一步步实现:
- 定义一个全局数组
long long memo[10000001];
- 判断之前是不是算过了,如果算过,则直接使用:
if (memo[n]>0) return memo[n];
- 如果没有算过,则算一遍,然后存进数组里:
else{ long long a = f(n - 1) + f(n - 2); memo[n] = a; return a; }
完整代码:
#include <iostream>
using namespace std;
long long memo[10000001]; //把数组声明为全局变量开的空间会比较大。
long long f(int n){
if (memo[n]>0) return memo[n];
if (n == 1 || n == 2) return 1;
else{
long long a = f(n - 1) + f(n - 2);
memo[n] = a;
return a;
}
}
int main(){
int n;
cin >> n;
cout << f(n) << endl;
}
这些代码成功的将时间复杂度降到了,可谓逝坟好用。
蛋柿,我又查到了想出来一个优化的方法:
#include <iostream>
using namespace std;
long long f(long long first, long long second, int n){
if (n > 0){
if (n == 1) return first;
if (n == 2) return second;
if (n == 3) return first + second;
return f(second, first + second, n-1);
}
}
int main(){
int n;
cin >> n;
cout << f(1, 1, n) << endl;
}
这个代码比之前的代码整整少算了一次(doge)虽然这计算一次用的时间基本上能忽略不计,但是,蚊子再小也是肉。所以,可以逝逝(并不代表我的代码都是错的)。
Python版代码
第一个代码:(想必没人会抄这个吧……)
def f(n):
if n == 1 or n == 2:
return 1
return f(n - 1) + f(n - 2)
n = int(input())
print(f(n))
第二个:
def f(n:int):
global a
if n in a:
return a[n]
if n == 1 or n == 2:
return 1
else:
b = f(n - 1) + f(n - 2)
a[n] = b
return b
n = int(input())
a ={}
print(f(n))
第三个:
def f(first, second, n):
if n > 0:
if n == 1:
return first
if n == 2:
return second
if n == 3:
return first + second
return f(second, first + second, n - 1)
n = int(input())
print(f(1, 1, n))
结尾
以上就是关于斐波那契数列的递归算法优化,Python程序输入数值不宜太大,否则会堆栈错误。所以你学废了吗