
正文
递归C++
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
递归C++一、递归简介
自己调用自己
二、递归写法2.1 写法介绍
先写出问题的递推公式
递归部分的边界条件就是递推公式中的边界条件
递归部分的主体部分就是递推公式中的主体部分
2.2 实例
(1)题目
例如:求n!。
(2)分析
递归公式为 f(n)=f(n-1)*n f(1)=1;
对应的递归:
/*
阶乘递归
递归公式为 f(n)=f(n-1)*n f(1)=1;
递归部分的边界条件就是递推公式中的边界条件 f(1)=1
递归部分的主体部分就是递推公式中的主体部分 f(n)=f(n-1)*n
*/
int factorial_Recursion(int n){
if(n==) return ;
else return factorial_Recursion(n-)*n;
}
(3)完整代码
#include <iostream>
using namespace std; int factorial(int n);
int factorial_Recursion(int n); /*
阶乘非递归
*/
int factorial(int n){
int ans=;
for(int i=;i<=n;i++){
ans*=i;
}
return ans;
} /*
阶乘递归
递归公式为 f(n)=f(n-1)*n f(1)=1;
递归部分的边界条件就是递推公式中的边界条件 f(1)=1
递归部分的主体部分就是递推公式中的主体部分 f(n)=f(n-1)*n
*/
int factorial_Recursion(int n){
if(n==) return ;
else return factorial_Recursion(n-)*n;
} int main(){
int ans;
//ans=factorial(5);
ans=factorial_Recursion();
printf("%d\n",ans);
return ;
}
(4)代码结果
120
三、递归实例3.1 辗转相除法求公约数
递推公式:f(a,b)=f(b,a%b) b!=0;
代码:
#include <iostream>
using namespace std; void exchange(int &a,int &b);
int commonDivisor(int a,int b);
int commonDivisor_Recursion(int a,int b); /*
交换a和b两个数的值
*/
void exchange(int &a,int &b){
a=a^b;
b=a^b;
a=a^b;
} /*
非递归辗转相除法求公约数:
用辗转相除法的时候要保证a大于等于b
*/
int commonDivisor(int a,int b){
if(b>a) exchange(a,b);
int tmp=a%b;
while(tmp){
a=b;
b=tmp;
tmp=a%b;
}
return b;
} /*
递归辗转相除法求公约数:
用辗转相除法的时候要保证a大于等于b
递推公式:f(a,b)=f(b,a%b) b!=0;
边界条件为: b!=0
递归主体为: f(a,b)=f(b,a%b)
*/
int commonDivisor_Recursion(int a,int b){
if(a%b==) return b;
else commonDivisor_Recursion(b,a%b);
} int main(){
int ans;
//ans=commonDivisor(15,9);
ans=commonDivisor_Recursion(,);
printf("%d\n",ans);
return ;
}
代码结果:
3
3.2 判断和相等
题目:
已知一个一维数组a[1...n]和一个确定的数m,判断能否使数组a中的任意几个元素之和等于m,能则输出YES,不能则输出NO。
分析:
分为取a[n]和不取a[n]的情况,则递推公式为:
f(n,m)=f(n-1,m-a[n])||f(n-1,m)
这里可以用一个全局变量来输出结果,只有有一种情况满足了,就满足了。
这个题目没完,后面要补。







