最近看了很多递归的代码,因为基础讲的都不是很详细,对我这种弱菜来说真是想死的心都有了,所以想有没有有趣的易于理解的方法。
看我人生中写的第一个递归:从n个数中选r个数并将它们从大到小输出
可以这么理解:假设有一个传销组织,每一个boss都可以发展下线,只要这条线上有r个人就可以成立这个传销小组,大boss现在要考量用哪条线,请你找出所有路线,当然你的下属一定要比你的等级低才行。
大boss有势利眼,它做了一个排名(for循环,为什么要用for循环呢?因为当一条线考察结束后大boss还要继续考察等级低一点下一个人), 首先考察等级最高的那个人,这个被选中的人是小boss他再考察比他等级低的人,直到人数足够,最后那个小喽罗回到他的直属boss那里报告,然后退下, 直属boss继续选下一个。要是选完了怎么办呢?小boss回去和它的直属上司报告,直到大boss没得选为止。
其实就是试探,回去的过程
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, r;
int book[11],a[15];
void dfs(int step,int n, int r)
{
if(step == r)
{
for(int i = 0; i < r; i++)
printf("%d",a[i]);
printf("\n");
return;
}
for(int i = n; i > 0; i --)
{
if(book[i] == 0)
{
if(step == 0)
a[step] = i;
else
if(i < a[step-1])
a[step] = i;
else
continue;
book[i] = 1; //每个进了这条线的人都要标记
dfs(step+1,n,r);
book[i] = 0; //每一次试探结束后要把标记取消
printf("b");
}
}
}
int main()
{
int n, r;
memset(book,0,sizeof(book));
scanf("%d%d",&n,&r);
dfs(0,n,r);
return 0;
}