递归算法研究
来源:互联网 发布:多盈软件骗局 编辑:程序博客网 时间:2024/06/08 06:33
今日来连连碰到递归算法的使用,于是自己便花时间看了一下。以下作为总结:
学过程序设计的朋友都知道,存在自调用的算法称作递归算法。递归算法设计的基本思想是:对于一个复杂的问题,把源问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递归的出口,这样源问题就有递归的解。
1、阶乘的求法。最简单的,也是最经典的题目。
package 递归;public class rec1 {/** * @param 求解n! */public static void main(String[] args) {rec1 rec1 = new rec1();System.out.println(rec1.fun(5));}public int fun(int num){if(num==1) return 1;return num*fun(num-1);}}
2、给定一个n(n<5000),不停的*2一直到结果>5000为止,然后输出这一连串的数字。如n=3,output:3,6,12,24,48,96,192,384,768,1536,3072。使用循环当然可以但是我们这里使用递归的方法来完成。
package 递归;public class rec2 {public static void main(String[] args) {rec2 rec2 = new rec2();rec2.fund(3);}public void fund(int i){if((i<<1)<5000) { //左移位相当于*2System.out.print((i)+","); fund(i<<1);} else { System.out.print((i)); return;}}}
3、一个射击运动员打靶, 靶一共有 10 环, 连开 10 枪打中 90 环的可能性有多少种?可以使用10层嵌套,但是我们使用递归的方法解决问题。
package 递归;public class rec3 {public static void main(String[] args) {rec3 rec3 = new rec3();rec3.fun(90, 9); System.out.println(rec3.cnt); }private int cnt= 0;public void fun(int score,int num){if(score<0||score>(num+1)*10) return; //查看是否需要继续下去if(num==0) { cnt++; return; }; for(int i=0;i<=10;i++) fun(score-i,num-1);}}
4、排列组合问题的解决。如{1,2,3,4,5,6} 一共有1*2*3*4*5*6中排列方式,请将他们依次输出。
package 递归;public class rec4 { /* * 获取排列组合的方法 */public static void main(String[] args) {int data[] = {1,2,3,4,5,6}; rec4 rec4 = new rec4(); rec4.fun("",data); System.out.println(rec4.sum);}private int sum = 0 ;public void fun(String prefix,int[]data){int len = data.length;if(len== 1) {System.out.println(prefix +data[0]);sum++;return;}for(int i=0;i<len;i++){int res [] = new int[len-1];int k = 0 ;for(int j=0;j<len;j++){if(j!=i) res[k++]=data[j];}fun(prefix + data[i],res); }} /* 全排数组方式递归2:常见的写法 */ public void recursion2(char []data, int len, int index) { if( index == len-1 ) { for(char a:data) System.out.print(a); System.out.println(""); } for(int i=index; i<len; i++) { char temp = data[index]; data[index] = data[i]; data[i] = temp; recursion2(data, len, index+1); temp = data[index]; data[index] = data[i]; data[i] = temp; } }}5、汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。汉诺塔要求:将第一座塔上的所有盘子,借助第二座塔,全部搬运到第三座塔上。规则:一次只能搬运一个盘子,不准将大盘子落在小盘子上。
package 递归;public class rec5 {public static void main(String args[]) {rec5 rec5 = new rec5();rec5.fun(4, 'A', 'B', 'C');System.out.println("一共有" + rec5.cnt + "中方法");}private int cnt = 0;public void fun(int topN, char from, char inter, char to) {if (topN == 1)// 将最后一个圆盘放到最终位置{System.out.println(" DISK 1 FROM " + from + " TO " + to);cnt++;} else {fun(topN - 1, from, to, inter);// 借助于目标位置先将除最后一个圆盘的所有圆盘放在中间位置System.out.println(" DISK " + topN + " FROM " + from + " TO " + to);cnt++;fun(topN - 1, inter, from, to);// 借助于初始位置将已经处于中间位置的除最后一个圆盘的所有圆盘放在目标位置}}}
6、 1 2 3 4 5 6 7 8 9 =N,输入N 请问在每个数字之间填入 +,-,或者不填使得结果等于N,输出一共有多少种填法,如1-2-34+56+78+9 = 108
package 递归;public class rec6 { public static void main(String[] args) { rec6 main = new rec6(); main.doRecursion(1, 108); System.out.println("总结果数为:"+main.count); } private int count = 0; private int []sign = new int[9]; //存储8个符号 void doRecursion(int i, int N) { for(int j=0; j<3; j++) { sign[i] = j; if(i==8) count = (getSum(N)) ? count+1 : count; else doRecursion(i+1, N); } } boolean getSum(int N) //获取当前的值是多少 { int sum = 0; StringBuffer sb = new StringBuffer(""); for(int i=1; i<=8; i++) { sb.append(i+""); if(sign[i] !=0 ) sb.append((sign[i] ==1)?"+":"-"); } sb.append("9"); String str = sb.toString(); int sign = 1; for(int i=0,len=str.length(); i<len; i++) { int end = i+1; while(end<len && str.charAt(end)>='0' && str.charAt(end)<='9') end++; sum = sum + Integer.parseInt(str.substring(i, end))*sign; sign = (end<len && str.charAt(end) == '+')?1:-1; i = end; } if(sum == N) System.out.println(str); return (sum == N); } }
7、编程之美 3.3 字符串的相似
package 递归;public class rec7{ public static void main(String args[]) { String strA = "rsgsety"; String strB = "sgsetyt"; System.out.println(rec7.CalculateStringDistance(strA, strA.length()-1, 0, strB, strB.length()-1, 0 )); } public static int CalculateStringDistance(String strA, int indA, int startA, String strB, int indB, int startB) { if(startB == indB) return (indA - startA ); if(startA == indA) return (indB - startB ); char a = strA.charAt(startA); char b = strB.charAt(startB); if(a==b) return CalculateStringDistance(strA, indA, startA+1, strB, indB, startB+1); else { int nx1 = 1 + CalculateStringDistance(strA, indA, startA+1, strB, indB, startB+1); int nx2 = 1 + CalculateStringDistance(strA, indA, startA+1, strB, indB, startB); int nx3 = 1 + CalculateStringDistance(strA, indA, startA, strB, indB, startB+1); int minValue = (nx1 < nx2)? nx1 : nx2; minValue = (minValue < nx3)?minValue :nx3; return minValue; } }}
8、编程之美 3.2电话号码对应英语单词
package 递归;import java.util.Stack;public class rec8{public static void main(String args[]){ new rec8().recursion("234", 3, 0 );}public String c[] = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };/* 使用递归进行单词的全输出 */ public Stack<Character> stack = new Stack<Character>(); public void recursion(String phone, int len, int index) { if( index == len ) { for(Object a:stack.toArray()) System.out.print(a); System.out.println(""); return; } String str = c[Integer.parseInt(phone.charAt(index)+"")]; for(int i=0; i<str.length(); i++) { stack.push(str.charAt(i)); recursion(phone, len, index+1); stack.pop(); } if( "".equals(str)) recursion(phone, len, index+1); }}
- 递归算法研究
- 对汉诺塔递归算法的研究
- 递归分析和分治算法 【待研究】
- 求递归算法时间复杂度:递归树【待研究】
- 递归研究
- 基于luence的中文分词算法研究(定长递归)
- 递归研究(一) 递归入门
- c++ 递归问题 研究
- php递归的研究
- 研究算法
- 算法研究
- 算法研究
- C++算法1-4 非递归遍历树的一点研究(习题5.82,5.83)
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- 递归算法
- Tomcat web.xml 和server.xml的配置说明 简单
- vim添加显示行号,自动缩进功能
- 二维数组类Douary
- hi3515sdk在redhat6.3上安装
- 离线安装ddd调试器
- 递归算法研究
- Learning Git
- Java基础复习:嵌套类和内部类
- 我的Java开发学习之旅------>自己编写的Java数组操作工具
- 第一个博客写什么呢
- 淘宝店铺模板中海报图片的尺寸是多少
- 7.OpenCv矩阵的掩码操作
- ZTREE DEMO
- 实现 lan 内的电脑 通过 wan 连到公网