若有一串字母ABC,进行全排列,有六种方法,3的阶层,321,为什么是这样呢,我们根据代码看思路(这之间会涉及递归,回溯):
将ABC看成数组,a[0]=A,a[1]=B,a[2]=C;(下文中用a0代替A,a1代替B,a2代替C),排列的过程就是交换位置的过程:
1、先对A进行交换(即k=0时):
a0和a0自己交换:ABC
a0和a1交换:BAC(此步还未执行,只有上一步递归交换完后才会自行此步)
a0和a2交换:CBA(此步还未执行,只有上一步递归交换完后才会自行此步)
从下图中的代码我们看出,在a0和a0 交换之后,k+1进入递归,同理在。
2、对ABC(此ABC 是a0和a0交换后的ABC)中的第二个位置进行交换:
a1和a1 进行交换:ABC
a1和a2 进行交换:ACB(此步还未执行只有上一步递归交换完后才会执行此步)
在a1和a1交换之后,k+1进入了递归
3、对ABC(此ABC 是a1和a1交换后的ABC)中的第三个位置进行交换:
a2和a2 进行交换:ABC
此时ABC即是最总排列的结果之一输出,同样结束递归后
会回到第2步 回溯完后,i+1交换形成ACB,在进入递归,进入第3步,此时ACB是最总排列的结果之一输出,再次结束递归回到第2步 ,回溯,回到第1步,此时进行回溯(交换恢复成原来队列的模样),然后i+1,交换形成BAC。
为何要进行回溯?
因为,递归完后3个字母的位置发生了变化,而我们在每次递归后进行交换位置都是在原位置顺序上进行交换,所以要进行交换回溯。
总的来说,由ABC 引出:ABC,BAC,CBA,
由ABC(a0和a0交换后)引出:ABC,ACB
由BAC引出:BAC,BCA
由CBA引出:CBA,CAB