0.摘要
给定n个不相同的数字,输出所有的排列方式。
1.思路
首先,我们回忆一下数学上解决排列问题的方法:
我们先从所有数据中选取一个,放在第一位;然后,再从剩下的数据中选取一个,放在第二位;不断重复,直到最后一位。这样我们就得到了所有的排列结果。
写成具体可操作的步骤即:
step1:a[0],a[1]……a[n],从n个元素选择一个
step2:除去step1已经选取的元素,从n-1个元素再选择一个
……
step(n):除去step1-step(n-1)已经选取的n-1个元素,只剩一个元素可选。
根据排列组合的思路:n个不同的数,排列组合共有n!种。因此,直接的思路是,使用n重for循环遍历,即可得到所有排列组合结果。
但是,这样的思路存在两个问题:
- 问题一:题目中给定的n并没有确定,所以for循环层数不确定。上述思路只适合n为确定数字的情况;
- 问题二:已经选取的元素,需要有一个数组记录状态,这样才能避免被重复选取
2.一个可行但不太好的方案:
首先,解决问题一:
分析上述问题,发现它符合运用递归的条件:
- 可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。
- 可以应用这个转化过程使问题得到解决。
- 必定要有一个明确的结束递归的条件。
如果在递归过程中加入for循环,那么随着递归层数的变化,自然就形成了多层for循环嵌套的结构。for循环的层数完全由