求解斐波拉契数列方法的改进
斐波拉契数列的求解相信大家都不陌生,最简单的方法就是简单递归,但事件复杂度为2的n次方。今天我将用动态规划的方法,将事件复杂度降到n,空间复杂度降到1
原始方法:简单递归,代码如下
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 30
using namespace std;
int fibonacci(int n)
{
if(n == 0 || n == 1)
return 1;
else
return fibonacci(n-1)+fibonacci(n-2);
}
int main()
{
int n,res;
cout<<"请输入斐波那契梳理数列的n:"<<endl;
cin>>n;
res = fibonacci(n);
cout<<"结果:"<<res;
return 0;
}
改进方法:动态规划,代码如下(所谓的动态规划,简单理解就是用一张表记录原问题分解成的子问题的解的结果,如用简单递归解斐波那契数列时,计算f(5)时,利用f(5)= f(4)+f(3),但计算 f(4)时又会用到 f(3),若能在计算 f(4)时将 f(3)的结果记录下来,就能减少递归次数)
自底而上
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 50
using namespace std;
int fb[maxnum]; //记录子问题的结果
int fibonacci(int n)
{
fb[0] = fb[1] = 1;
if(n < 2)
return 1;
else
{
for(int i=2; i<=n; i++)
fb[i] = fb[i-1]+fb[i-2];
return fb[n];
}
}
int main()
{
int n,res;
cout<<"请输入斐波那契梳理数列的n:"<<endl;
cin>>n;
res = fibonacci(n);
cout<<"结果:"<<res;
return 0;
}
自顶而下(递归改进)
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 50
using namespace std;
int fb[maxnum] = {0}; //记录子问题的结果
int fibonacci(int n)
{
fb[0] = fb[1] = 1;
if(n < 2)
return 1;
else
{
if(fb[n] != 0) //若结果已经计算过并存储在了fb数组中,则不需要在递归
return fb[n];
else
{
return fibonacci(n-1)+fibonacci(n-2);
}
}
}
int main()
{
int n,res;
cout<<"请输入斐波那契梳理数列的n:"<<endl;
cin>>n;
res = fibonacci(n);
cout<<"结果:"<<res;
return 0;
}
实际上不需要将每个结果都存储,只需要存储n-1和n-2,在次改进空间复杂度
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define maxnum 50
using namespace std;
int fibonacci(int n)
{
int a = 1,b = 1;
if(n < 2)
return 1;
else
{
for(int i=2; i<=n; i++)
{
b = a + b;
a = b - a;
}
return b;
}
}
int main()
{
int n,res;
cout<<"请输入斐波那契梳理数列的n:"<<endl;
cin>>n;
res = fibonacci(n);
cout<<"结果:"<<res;
return 0;
}
** 希望能给你带来帮助,欢迎留言指正**
来源:CSDN
作者:杨岚(⊙﹏⊙)
链接:https://blog.csdn.net/qq_44651133/article/details/104144974