递推、迭代、递归入门

递推、迭代、递归入门

递推和递归是用计算机解决问题的两种基本方法,最能体现计算机程序解决问题的特点。两种方法并无本质区别,只不过思考问题的方向不同。递推是从小到大,递归是从大到小。打个比方:如果要建造一个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、辗转相除法求两数的最大公约数

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值