c++详解递归算法-全网最全+例题讲解

什么是递归?

递归的思想是什么?

什么时候该用递归?

使用递归需要注意哪些问题?

递归思想解决经典问题

递归和循环的区别是什么?

递归算法:

定义:直接或间接地出现对自身的调用

本质:递归即递进回归,基本思想就是把规模大的问题转化为规模小的相似的子问题来解决。但必须有一个结束条件(递归出口)

利用递归完成的题目特点:

  1. 可以将当前问题转换成规模更小的问题,且新问题和原问题解法完全相同

  1. 有一个明确的递归边界

例题1 数列1 2 3 4 5 6 7…………,代码实现输入一个数n,输出数列第n项的值。

#include<bits/stdc++.h>
using namespace std;
//求数列1,2,3,4……的第n项
int f(int n)
{
    if(n==1)
        return 1;
    else
        return f(n-1)+1;
}
int main()
{
    int n;
    cin>>n;
    printf("%d",f(n));
    return 0;
}

解释:递归关系:f(n-1)+1,递归出口:1;

例题2:数列1 3 5 7 9……代码实现输入一个数n,输出数列第n项的值。

#include<bits/stdc++.h>
using namespace std;
int f(int n)
{
    if(n==1)
        return 1;
    else
        return f(n-1)+2;
}
int main()
{
    int n;
    cin>>n;
    printf("%d",f(n));
    return 0;
}

解释:递归关系:f(n-1)+2,递归出口:1;

例题3:斐波那契数列:1,1,2,3,5,8,13,21,34,55,89…

代码实现

#include<bits/stdc++.h>
using namespace std;
int f(int n)
{
    if(n==1||n==2)
        return 1;
    else
        return f(n-1)+f(n-2);
}
int main()
{
    int n;
    cin>>n;
    printf("%d",f(n));
    return 0;
}

解释:递归关系:f(n-1)+f(n-2),递归出口:f(1)=1,f(2)=1;

例4:用递归方法求:1+2+3+……+n=

代码实现:

#include<bits/stdc++.h>
using namespace std;
int f(int n)
{
    if(n==1)
        return 1;
    else
        return f(n-1)+n;
}
int main()
{
    int n;
    cin>>n;
    printf("%d",f(n));
    return 0;
}

解释:递归关系:f(n-1)+n,递归出口:1;

例5

代码实现:

#include<bits/stdc++.h>
using namespace std;
int f(int n)
{
    if(n==1)
        return 2;
    else
        return f(n-1)+n;
}
int main()
{
    int n;
    cin>>n;
    printf("%d",f(n));
    return 0;
}

解释:递归关系:f(n-1)+n,递归出口:n=1;

先列举几项就会发现规律

第一刀2

第二刀2+2=4

第三刀 4+3=7

第四刀 7+4=11

……

第n-1刀 i

第n刀 i+n

如图

例6

杨辉三角

#include<bits/stdc++.h>
using namespace std;
int f(int x,int y)
{
    if(y==0||x==y)
        return 1;
    else
        return f(x-1,y-1)+f(x-1,y);
}
int main()
{
    int x,y;
    cin>>x>>y;
    printf("%d",f(x,y));
    return 0;
}

用递归方法求:两个数的最大公约数

最大公约数就是两个数中,大家都能相约的数

辗转相除法

又名欧几里得算法,目的是求出两个正整数的最大公约数。它是最古老的算法,其可追溯刀公元前300年前。

这条算法基于一个定理:两个正整数a和b(a>b),他们的最大公约数等于a除以b的余数c和较小数b之间的最大公约数。

例7求两个数的最大公约数

方法1:非递归法

int gcd(int a,int b)
{int r=a%b;
while(r!=0)
{
a=b;
b=r;
r=a%b;
}
return b;
}

方法2 递归法

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
    int r=a%b;
    if(r==0) return b;
    return gcd(b,r);
}
int main()
{
    int b,r;
    cin>>b>>r;
    printf("%d",gcd(b,r));
    return 0;
}

例题8 汉诺塔问题

代码实现:

#include<bits/stdc++.h>
using namespace std;
void hanoi(int n,char a,char b,char c)
{
    if(n==1)
        printf("%c-%c\n",a,c);
    else
    {
        hanoi(n-1,a,c,b);
        printf("%c-%c\n",a,c);
        hanoi(n-1,b,a,c);
    }
}
int main()
{
    int n;
    cin>>n;
    hanoi(n,'a','b','c');
    return 0;
}

  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值