斐波拉契数列是一个很不错的例子,它的第一项和第二项都为1,以后的每一项都是前两项的和。
这样,斐波拉契数列可以有很多种解法。
首先用递归:
//递归for斐波那契数列
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
long long work(int n){
if(n==1||n==2){
return 1;
}
else{
return work(n-1)+work(n-2);
}
}
int main()
{int n;
//freopen("fei.in","r",stdin);
//freopen("fei.out","w",stdout);
scanf("%d",&n);
printf("%lld",work(n));
return 0;
}
普通递归的方法存在很多的重复计算。效率自然很低。比如在算f(n-1)的时候,已经把f(n-2)算出来了,但是递归还要再算一次f(n-2)。
所以采用分治,一段一段计算,减少重复计算。
二分:
//二分分治for斐波那契
#include<cstdio>
double n;
int k;
long long s,a;
long long sishewuru(double g){
if(g>=(int)g+0.5){
return g+1;
}
else return g;
}
long long er(lo