当我们有一个所有元素都互不相同的数组,且准备把里面的元素进行全排列时,我们会怎么做?
举个例子,现在我们有一个含有1,2,3三个元素的数组,现在我们准备找出它们的全排列。大部人的做法是先在第一个位置放1,第二个位置放2,第三个地方放3;然后还是第一个位置放1,交换2和3的位置;之后换成2放在第一个,对1和3进行之前相似的做法。
那么当我们有很多数时,思路也是类似的,就是先固定前面的数的排序,然后依次交换后面数的位置,当后面数所有排法都有了之后,再将后面数依次和固定数的最后一个交换,然后利用类似的方法进行排序。今天我们用的就是这种思路。
template<typename T>
void perm(T array, int index, int size)
{
if (index >= size)
{
for (int i = 0; i <= size; i++)
cout << array[i] << " ";
cout << endl;
}
else
{
for (int i = index; i <= size; i++)
{
swap(array[i], array[index]);
perm(array, index+1, size);
swap(array[i], array[index]);
}
}
}
递归最难理解的部分是一直不能得到结果,直到一直递归到最底层才结束。我们可以选择从底层回溯回来,这样便于理解。