递归的应用_字符所有的排列组合
来源:互联网 发布:大数据产生 编辑:程序博客网 时间:2024/05/17 08:26
递归在数学上属于归纳法的范畴,在编写递归例程的时候要注意四条基本原则:
1.基准情形,必须总是要有基准情形,它无需归纳就能解除。
2.不断推进,对于那些需要递归求解的情形,每一次递归都必须使情况超一种基准情形推进。
3.设计法则,假设所有的递归都能运行。
4.合成效益法则,在求解一个问题的同一个实例时,不要在不同的递归调用中做重复的工作。
其实我们只要记住这4条法则,那么递归程序的设计就应该是简单明了了。下面我们以打印字符所有的排列组合为例,进行分析。
题目:假设有一个字符数组,如char[] str = new char[]{'a', 'b', 'c'};那么输入这个字符数组所有的排列组合:abc acb bac bca cab cba。字符数组任意。
这个例子的总体思路是:
1. 按次序,把数组中的所有元素移动到下标为0的位置,剩余元素移动到下标1~str.length-1的位置。
2.根据步骤1,保证下标为0元素不动,按次序,把1~str.length-1元素移动到下标1的位置,剩余元素移动到下标2~str.length-1的位置。
3.根据步骤2,保证下标为0,1元素不动,按次序,把2~str.length-1元素移动到下标1的位置,剩余元素移动到下标3~str.length-1的位置。
类推,一直到字符数组结束。
那么总结一下,假设当前要移位的下标为low(因为从低位0开始),那么我们要做的事情是
保证[0-low)的元素不动,按次序把把[low-str.length-1]元素移动到下标low的位置,剩余元素移动到下标(low-str.length-1]的位置。
根据递归的设计原则:
1.基准情形:当low==str.length-1时(移动到数组的结束),打印出字符数组str
public static void main(String[] args) {char[] str = new char[]{'a', 'b', 'c'};permute(str, 0);}/** * @Title: permute * @Description: 把[low-str.length-1]元素移动到下标low的位置 * 1.当结束时打印字符数组 * 2.没有结束,继续递归调用 * @param str,字符数组 * @param low,要移位的下标 * @throws */public static void permute(char[] str,int low) {if(low == str.length - 1) {System.out.println(new String(str));}else{char temp;//临时字符,用来交换元素。for(int i = low;i <= str.length - 1;i++) {//依次把下标为low与high进行交换,相当于移位操作。temp = str[low]; str[low] = str[i];str[i] = temp;//递归(不停的移位),一直到数组下标的最后。 permute(str.clone()//Java传引用,防止移位操作对后续程序的影响 , low + 1);}}}
2.不断推进:保证[0-low)的元素不动,按次序把把[low-str.length-1]元素移动到下标low的位置,剩余元素移动到下标(low-str.length-1]的位置。
3,4条原则没有用上。
说的可能不太明白,可以直接省略,看代码吧。
- 递归的应用_字符所有的排列组合
- 显示字符串中所有字符的排列组合。
- 显示字符串中所有字符的排列组合。
- 输出数组的所有元素的排列组合(递归)
- 小程序:递归实现所有变位词的排列组合
- [IOS 开发] 穷举数组字符的所有排列组合的可能性
- 排列组合的递归算法
- 排列组合的递归实现
- 排列组合的递归
- 所有数字的排列组合
- 任意数字、字符序列,输出它们所有的排列组合
- 排列组合算法的递归实现
- 递归—排列组合的实现
- 递归的思想生成排列组合
- 字符串排列组合的应用
- 输出字符串的所有排列组合
- 字符串所有可能的排列 例如abcd等等 递归算法和排列组合知识结合
- 9.9递归和动态规划(五)——确定某字符串的所有排列组合
- TSM中备份(Backup)和归档(Archive)的区别
- Some Expressions about Heart
- 2011-12-29学习所得
- 插入不重复
- 2161 DS寂寞了…
- 递归的应用_字符所有的排列组合
- arm堆栈知识
- C/C++ 程序设计员应聘常见面试试题深入剖析
- 今天中午去浩清图书馆了
- 设置listctrl高度
- winHTMLEditorControl 被这编辑器搞死了
- ss IE6 IE7 IE8 IE9 Firofox写法区别
- TSM中备份(Backup)和归档(Archive)的区别
- 如何禁用win7的ASLR