生成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