递推、迭代、递归入门
递推和递归是用计算机解决问题的两种基本方法,最能体现计算机程序解决问题的特点。两种方法并无本质区别,只不过思考问题的方向不同。递推是从小到大,递归是从大到小。打个比方:如果要建造一个10层的楼房,递推是先建好第1层,再建第2层,再建第三层,直到第10层为止。递归是这样思考的:我要建第10层,你给我一个9层的楼房,我在上面加一层就是10层了,如不没有9层的楼房,给我一个8层的,我先加一层就是9层了…,如此还是要建第一层。
递推符合人的思考习惯,一般效率较高。递归的效率一般不如递归,但递归是计算机编程的重要思想,我们解决问题不妨从递推和递归两方面都考虑。
递推使用循环,递归使用栈(隐含的循环)
迭代不断使用变量的旧值推导出新值的过程,这一点与递推是一样的,递推一般要用到数组,会占用一定的空间,但更直观;迭代反复使用变量,占用空间较少。
理解了递推和递归,编程可算是入门了。
下文从最简单问题开始,逐步过渡到较难的问题。
1、等差数列的递推和递归:输出等差数列1 3 5 7 9 的第n项。
递推:第一项是1,后一项是前一项加2,递推关系是:a[n]=a[n-1]+2
#include <bits/stdc++.h>
using namespace std;
int a[100];
int main(){
int n;
cin>>n;
a[1]=1;
for(int i=2;i<=n;i++) {
a[i]=a[i-1]+2;
}
cout<<a[n]<<endl;
return 0;
}
迭代
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a=1;
for(int i=2;i<=n;i++){
a=a+2;
}
cout<<a<<endl;
return 0;
}
递归:1.f(n)表示数列的第n项 2、后一项是前一项加2,递归关系是:f(n)=f(n-1)+2 3、边界条件,当n==1时,值是1。
#include <bits/stdc++.h>
using namespace std;
int f(int n){
if (n==1) return 1;
return f(n-1)+2;
}
int main(){
cout<<f(3)<<endl;
return 0;
}
2、等比数列的递推和递归:输出等比数列1 2 4 8…的第n项
递推:第一项是1,后一项是前一项乘2,递推关系是:a[n]=a[n-1]*2
#include <bits/stdc++.h>
using namespace std;
int a[100];
int main(){
int n;
cin>>n;
a[1]=1;
for(int i=2;i<=n;i++) {
a[i]=a[i-1]*2;
}
cout<<a[n]<<endl;
return 0;
}
迭代
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a=1;
for(int i=2;i<=n;i++){
a=a*2;
}
cout<<a<<endl;
return 0;
}
递归:1.f(n)表示数列的第n项
2、后一项是前一项乘2,递归关系是:f(n)=f(n-1)*2
3、边界条件,当n==1时,值是1。
#include <bits/stdc++.h>
using namespace std;
int f(int n){
if (n==1) return 1;
return f(n-1)*2;
}
int main(){
cout<<f(3)<<endl;
return 0;
}
3、n的阶乘$n!=1 * 2 * 3…
递推:第一项是1,后一项是前一项乘n,递推关系是:a[n]=a[n-1]*n
#include <bits/stdc++.h>
using namespace std;
int a[100];
int main(){
int n;
cin>>n;
a[1]=1;
for(int i=2;i<=n;i++) {
a[i]=a[i-1]*i;
}
cout<<a[n]<<endl;
return 0;
}
迭代
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a=1;
for(int i=2;i<=n;i++){
a=a*i;
}
cout<<a<<endl;
return 0;
}
递归:1.f(n)表示1到n项的乘积
2、后一项是前一项乘n,递归关系是:f(n)=f(n-1)*n
3、边界条件,当n==1时,值是1。
#include <bits/stdc++.h>
using namespace std;
int f(int n){
if (n==1) return 1;
return f(n-1)*n;
}
int main(){
cout<<f(5)<<endl;
return 0;
}
4、辗转相除法求两数的最大公约数