递推算法分为函数递推和主程序递推,函数递推又称子程序递推,是递推中的重要分支。
主程序递推:
#include<iostream>
using namespace std;
int x=11111,y=111,z;
int main() {
for(long long i=1;i<=11;i++) {
z=x+y;
x=y;
y=z;
}
cout<<z;
return 0;
}
以上代码运行得到的结果为1004863。
函数递推:
#include<iostream>
using namespace std;
int l(int n) {
if(n==1) {
return 1;
}else if(n==2) {
return 1;
}else {
return l(n-1)+l(n-2);
}
}
int main() {
cout<<l(11);
return 0;
}
以上代码运行得到的结果为89。
递推的思想是把一个庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快的机器特点。
#include<iostream>
using namespace std;
long long n;
long long fibonacci(long long n) {
if(n<3) {
return 1;//第一项和第二项都是1
}
return fibonacci(n-1)+fibonacci(n-2);//斐波那契数列的第N项就是第N-1项和第N-2项之和
}
int main() {
cin>>n;
cout<<fibonacci(n);//计算斐波那契数列的第N项
return 0;
}
这段代码用递推的思想计算出了斐波那契数列的第n项。时间复杂度:O(2^n)、空间复杂度:O(n)。
来道题目练练手吧:
题目描述
已知,求
的值。
输入格式
共一行
一个自然数n
输出格式
共1行
一个正整数
输入输出样例
输入 #1
6
输出 #1
8
说明/提示
0<n<48
题解:
刚拿到这题,乍一看,代数式!
于是迅速算起:
设a=(1+sqrt(5))/2,b=(1-sqrt(5))/2
原式=(a^n-b^n)/sqrt(5)=(a-b)(a^(n-1)+a^(n-2)*b...b^(n-1))
把 a=(1+sqrt(5))/2 , b=(1-sqrt(5))/2 代进式子里
惊奇地发现a-b=1
再把(a^(n-1)+a^(n-2)*b...b^(n-1))算出来就好了
于是开始找规律
n=1:原式=1;
n=2:原式=1;
n=3:原式=2;
n=4:原式=3;
n=5:原式=5;
发现居然是斐波那契数列,但是问题又来了,怎么证明呢?
f(n-2)为(x-y)/2
f(n-1)为(xa-yb)/2
f(n)为(xa^2-yb^2)/2
所以f(n)=(x(6+sqrt(10)/4-y(6-sqrt(10)/4)/2=((x-y)+(x(1+sqrt(5))/2-y(1-sqrt(5))/2))/2=(x-y)/2+(xa-yb)/2=f(n-2)+f(n-1)。看到这样的方程,密集恐惧症患者倒吸一口凉气、当场嗝屁。
代码:
#include<iostream>
using namespace std;
long n,x=1,y=1,z=0;
int main() {
cin>>n;
for(long i=2;i<n;i++) {
z=x+y;
x=y;
y=z;
}
cout<<z;
return 0;
}
如果这篇文章对你有帮助的话,记得点个赞和收藏再走啊 !!!