递归算法设计的基本思想是:
对于一个复杂的问题,把原问题分解为若干个相对简单类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。
在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。其实这个出口是非常好理解的,就是一个条件,当满足了这个条件的时候我们就不再递归了。
(2)地推逐步向出口逼近
(1)阶乘:
要求:给定一个数值,计算出它的阶乘值,例如5的阶乘为5*4*3*2*1
实现:
private static BigDecimal getNum(BigDecimal inNum) {
if (inNum.compareTo(BigDecimal.ONE) == 0) {
return inNum;
}
return inNum.multiply(getNum(inNum.subtract(BigDecimal.ONE)));
}
Fibonacci数列 汉诺塔 要求:汉诺塔挪动 实现: 排列组合 要求:将输入的一个字符串中的所有元素进行排序并输出,例如:你给出的参数是"abc", 则程序会输出 abc private static int fab(int index) { if (index == 1 || index == 2) {
return 1;
} else {
return fab(index - 1) + fab(index - 2);
}
}
private static void move(int num, String from2, String mid2, String to2) {
if (num == 1) {
System.out.println("move disk 1 from " + from2 + " to " + to2);
} else {
move(num - 1, from2, to2, mid2);
System.out.println("move disk " + num + " from " + from2 + " to " + to2);
move(num - 1, mid2, from2, to2);
}
}
acb
bac
bca
cab
cba
public static void permute(char[] list, int low, int high) {
int i;
if (low == high) {
String cout = "";
for (i = 0; i <= high; i++) {
cout += list;
}
System.out.println(cout);
} else {
for (i = low; i <= high; i++) {
char temp = list[low];
list[low] = list;
list = temp;
permute(list, low + 1, high);
temp = list[low];
list[low] = list;
list = temp;
}
}
}
作者: 张弗睿 时间: 2016-9-12 14:59
恍然大悟 ,感谢大神的点拨
作者: 383412263 时间: 2016-9-12 16:47
最近在看,谢谢分享
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2