递归详解(很实用)

如果有需要请关注下面微信公众号,会有收获;

递归的定义:在一个函数中再次调用该函数自身的行为叫做递归,通俗的来说就是自己调用自己,

其中的思想本质就是:对这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;
} 

未完持续更新中。。。。。。

猜你喜欢

转载自blog.csdn.net/xyqqwer/article/details/83448508