什么是递归?
递归的思想是什么?
什么时候该用递归?
使用递归需要注意哪些问题?
递归思想解决经典问题
递归和循环的区别是什么?
递归算法:
定义:直接或间接地出现对自身的调用
本质:递归即递进与回归,基本思想就是把规模大的问题转化为规模小的相似的子问题来解决。但必须有一个结束条件(递归出口)
利用递归完成的题目特点:
可以将当前问题转换成规模更小的问题,且新问题和原问题解法完全相同
有一个明确的递归边界
例题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=
代码实现:文章来源地址https://www.toymoban.com/news/detail-733587.html
#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 汉诺塔问题文章来源:https://www.toymoban.com/news/detail-733587.html
代码实现:
#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;
}
到了这里,关于c++详解递归算法-全网最全+例题讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!