最近看了很多递归的代码,因为基础讲的都不是很详细,对我这种弱菜来说真是想死的心都有了,所以想有没有有趣的易于理解的方法。

首先什么时候要用递归?当一个问题有多个步骤,并且每个步骤都有多个选择的时候。

看我人生中写的第一个递归:从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;
}