全排列的简单递归方法(有重复元素和无重复元素的递归算法)
2014-10-29 15:35
246 查看
无论是有重复元素还是无重复元素,他们调用递归的主要步骤都是一样的。递归算法如下:
对于无重复元素的情况,只要用一个循环,分别递归遍历所有元素。代码如下:
swap(chars[i],chars[flag]);//把当前元素和当前元素后面的元素依次交换 fun(n,chars,flag+1);//调用递归 swap(chars[i],chars[flag]);//在每次交换完之后,要把原来的数组的顺序还原
对于无重复元素的情况,只要用一个循环,分别递归遍历所有元素。代码如下:
void fun(int n,char chars[],int flag) { if(flag==n-1) { //这里的结束标记没必要是flag==n,因为最后一个元素是不用交换的 for(int i=0;i<n;i++) cout<<chars[i]; cout<<endl; return; } for(int i=flag;i<n;i++) { swap(chars[i],chars[flag]); fun(n,chars,flag+1); swap(chars[i],chars[flag]); } }而对于有重复元素的情况,只要加一个简单的判断语句即可:
void fun(int n,char chars[],int flag) { if(flag==n-1) { for(int i=0;i<n;i++) cout<<chars[i]; cout<<endl; return; } for(int i=flag;i<n;i++) { if(chars[i]!=chars[flag]||i==flag){//若两个元素不相等或者两个元素的下标相同的时候才调用 swap(chars[i],chars[flag]); fun(n,chars,flag+1); swap(chars[i],chars[flag]); } } }
相关文章推荐
- 简单全排列C递归实现 没考虑重复情况
- 链表有环判断,快慢指针两种方法/合并链表/删除重复元素/二分递归和while
- javascript剔除数组重复元素的简单方法
- C# 去除数组重复元素的简单方法
- js过滤数组重复元素的简单方法
- 递归实现全排列(可包含重复元素)
- 简单全排列C递归实现 没考虑重复情况
- 面试题------全排列的非递归和递归实现(含重复元素)
- 用递归的方法求数组中元素的最大值和最小值
- 简单的防止页面刷新重复提交的方法
- 去掉数组中重复的元素方法
- [导入]去掉数组中重复的元素方法
- 递归列举从数组b()中选出某些元素(允许重复)使其和等于num的所有组合
- 在FLEX中过滤简单数组中的重复元素.
- 非递归实现不重复序列的全排列(一)
- 非递归实现不重复序列的全排列(二)
- 一个简单的防止同一ID重复登陆的方法
- javascript如何判断数组内元素是否重复的方法集锦
- 闭合浮动元素超级简单的方法http://www.jluvip.com/blog/article.asp?id=281
- 递归列举从数组b()中选出某些元素(允许重复)使其和等于num的所有组合