生成1~n的排列/需要n层循环嵌套的情况通常用递归实现

原创、转载请注明出处

输出1~n的所有排列

最直接的想法是,n层循环输出所有排列。

 

n层循环用递归的原因:n层循环是个嵌套的结构,嵌套的层数是个变量,手动写嵌套不知道写几层,而一想到嵌套肯定是调用函数(这句可能是敲代码的感觉),函数不断调用函数就是递归了。(自己的想法)

其实,嵌套的n层循环像一棵树,一层嵌套有几层循环一个结点就有几个分支,这里就是根节点有n-1个分支,每个分支又有n-2个分支,以此类推,每个结点有个数值,排列就是从根节点到叶子结点路径上的所有结点。(构造的时候是n叉树,不能放和之前重复的数,所以砍掉一些,前面确定了多少个结点就砍掉多少)

 

那么,接下来就是写函数了,既然是嵌套的for循环,那么函数里面肯定要有for循环,这样函数调用函数才能让for循环里有for循环。

 

每一层的任务是把当前位置能够放的元素放到A[]里面(或者说选一个元素放到A中),当前位置能放的元素是除了确定好的元素之外所有的元素,所以为了确定能放哪些元素函数要传数组A(也可以设成全局的),还要知道要确定哪个位置上的元素,另外,从n个数中剔除确定的元素还要知道n。

 

然后既然是递归肯定要有边界,边界就是A数组填满了,输出。

 

代码如下:

#include<iostream>
using std::cin;
using std::cout;
using std::endl;

void f(int A[], int cur, int n)
{
    if(cur == n)
    {
        for(int i = 0; i < n; i++)
        {
            cout << A[i] << ' ';
        }
        cout << endl;
    }
    else
    {
        for(int i = 1; i <= n; i ++)
        {
            bool flag = true;
            for(int j = 0; j < cur; j ++)
            {
                if(i == A[j])
                {
                    flag = false;
                }
            }
            if(flag)
            {
                A[cur] = i;
                f(A,cur + 1,n);
            }
        }
    }
}

int main()
{
    int n;
    cin >> n;
    int A[10000];
    f(A,0,n);
    return 0;
}

 排列相关算法可转http://www.cnblogs.com/mu-ye/p/7667323.html

posted @ 2017-10-11 15:33  哲贤  阅读(1409)  评论(0编辑  收藏  举报