百度安全验证
百度安全验证
全排列的递归问题 递归出口照不清楚,每次Perm(list,k+1,m);后的K分不清 找不到上一层。。
m是list的长度吗?还是最后一个元素的下标? 如果是下标就总是少解。m是长度的话,这个算法的思想就是:1.固定第一个元素,剩下的全排形成一个解。2.该元素对应的解求完后,在下一个循环和第i个元素交换。这样每个元素都可以成为第一位的元素。每个循环结束后还原数组。3.然后把第一个元素不同的排列加起来就是全部的解。考虑三个元素ABC的全排,那么调用perm()递归的深度就是3+1=4第一层 第一次循环 i=0,k=0,m=3 swap(0,0)没效果 还是ABC perm(,1,3)开始对后两个元素全排 进入第二层递归!! 第一次循环 i=1,k=1,m=3 swap(1,1)无效果 perm(,2,3)最后一个元素全排 进入第三层递归!! swap(2,2)无效果 perm(,3,3) 进入第四层递归!! 打印结果 ABC!! 返回第三层递归!! swap(2,2)无效果,i自加得3,循环结束 返回第二层递归!! swap(1,1)无效果,i自加得2 第二次循环 i=2,k=1,m=3 swap(2,1)交换第二第三元素得 ACB 进入第三第四层递归打印结果 ACB!! swap(1,2)交换第二第三元素得 ABC i自加得3,循环结束 返回第一次递归!! swap(0,0)无效果,i自加得1第一层 第二次循环 i=1,k=0,m=3 初始为ABC 交换得:BAC 和前面类似的操作,输出 BAC,BCA后返回第一层,返回状态为BAC 交换得:ABC第一层 第三次循环 i=2,k=0,m=3 初始为ABC 交换得:CBA 和前面类似的操作,输出 CBA,CAB后返回第一层,返回状态为CBA 交换得:ABC六个结果就是依次:ABC,ACB,BAC,BCA,CBA,CAB