如果有需要请关注下面微信公众号,会有收获;
递归的定义:在一个函数中再次调用该函数自身的行为叫做递归,通俗的来说就是自己调用自己,
其中的思想本质就是:对这n个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。
下面我们来看这段代码;
#include<iostream>
using namespace std;
int a1[100],m=0 ;
void fun(int a)
{
int i;
printf("%d ",a);
for(i=0;i<a;i++)
{
a1[m++]=i;
fun(a - 1);
}
}
int main()
{
int n;
cin>>n;
fun(n);
cout<<"\n";
for(int j=0;j<m;j++)
{
cout<<a1[j]<<" ";
}
return 0;
}
我们简单的分析一下;
fun(3);//初始调用时,a值等于3
为了方便说,后面调用fun函数时,a值等于几,就叫几号递归
fun(3)//3号递归开始执行
运行printf("%d ",a); //输出3
运行for循环,i=0,i<3,
调用fun(3-1)
fun(2)//2号递归开始执行
运行printf("%d ",a); //输出2
运行for循环,i=0,i<2,
调用fun(2-1)
fun(1)//1号递归开始执行
运行printf("%d ",a); //输出1
运行for循环,i=0,i<1,
调用fun(1-1)
fun(0)//0号递归开始执行
运行printf("%d ",a); //输出0
运行for循环,i=0,i<0,不成立
******************>至此,输出了3,2,1,0
0号递归不成立后,回归1号递归的for循环处,进行i++处理,//i=0时第一次for循环结束
运行for循环,i=1,i<1,不成立
1号递归不成立后,回归2号递归的for循环处,进行i++处理,
运行for循环,i=1,i<2,
调用fun(2-1)
再度运行fun(1)//1号递归
从上面可以看出,1号递归的运行会输出1,0
------------------------>至此,输出了3,2,1,0,1,0
1号递归不成立后,回归2号递归的for循环处,进行i++处理,
运行for循环,i=2,i<2,不成立
2号递归不成立后,回归3号递归的for循环处,进行i++处理,
运行for循环,i=1,i<3,
调用fun(3-1)
再度运行fun(2)//2号递归
从上面可以看出,2号递归的运行会输出2,1,0,1,0,2,1,0
------------------------>至此,输出了3,2,1,0,1,0,2,1,0,1,0,2,1,0
2号递归不成立后,回归3号递归的for循环处,进行i++处理,
运行for循环,i=2,i<3,
调用fun(2-1)
再度运行fun(1)//1号递归
从上面可以看出,1号递归的运行会输出1,0
------------------------>至此,输出了3,2,1,0,1,0,2,1,0,1,0,2,1,0,1,0
2号递归不成立后,回归3号递归的for循环处,进行i++处理,
运行for循环,i=3,i<3,不成立
至此递归结束
所以最后输出结果为:
3 2 1 0 1 0 2 1 0 1 0 2 1 0 1 0
以上是for循环里的递归;
下面我们来看看一个函数里有两个递归的情况;
例.给定整数a1,a2,a3....an,判断是否可以从中选出若干数,使它们的和为K;
限制条件:1.1<=n<=20
2.-10^8<=ai<=10^8;
3.-10^8<=k<=10^8
输入:n,K;a1,a2,a3,,,,,,an;
输出:如果存在输出Yes,否则输出No;
思路:这就是组合问题的类型;对于每个ai都有选择和不被选择的情况;
我们可看下它的状态转移的样子;
输入n=4,k=13,a1=1,a2=2,a3=4,a4=7;
代码如下;
#include<bits/stdc++.h>
using namespace std;
int n,k;
int a[100];
bool dfs(int i,int sum)
{
cout<<i<<" "<<sum<<endl;
if(i==n)
{
return sum==k;
}
if(dfs(i+1,sum))//不选择ai
{
return true;
}
if(dfs(i+1,sum+a[i]))//选择ai
{
return true;
}
return false;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
if(dfs(0,0))
{
cout<<"YES";
}
else
{
cout<<"NO";
}
return 0;
}
未完持续更新中。。。。。。