排列组合问题

若有一串字母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

源代码

源代码

输出结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值