tips
- 方法的第一条总是包含一个return的条件语句
- 递归调用总是尝试去解决一个规模更小的子问题,这样递归才能收敛到最简单的情况
- 递归调用的父问题和尝试解决的子问题之间不应该由交集
一个有意思的递归,来自《算法》1.1.16 & 1.1.17
//代码
package chapter1;
import java.util.Scanner;
public class practice16 {
public static int exR1(int n) {
if (n <= 0)
return 0;
return exR1(n - 3) + n + exR1(n - 2) + n;
}
public static String exR2(int n) {
if (n <= 0)
return "";
return exR2(n - 3) + n + exR2(n - 2) + n;
}
/* 这个递归是死递归
只能递归到发生StackOverflowerError(栈溢出异常)
因为可以跳出的递归的return语句不是在第一句
public static String exR3(int n) {
return exR2(n - 3) + n + exR2(n - 2) + n;
if (n <= 0)
return "";
}
*/
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.println("i:"+i+" exR1: "+exR1(i));
System.out.println("i:"+i+" exR2: "+exR2(i));
}
}
}
结果:
i:1 exR2: 11
i:2 exR1: 4
i:2 exR2: 22
结果分析:以i=1为例:
exR2(1 - 3) + 1 + exR2(1 - 2) + 1
=> exR2(-2) + 1 + exR2(0) + 1;
=> ""+1+""+1
=> 11
递归最典型的例子:
斐波那契数列:从第三位开始,每位都是前两位之和
public class practice19 {
public static long f(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return f(n - 1) + f(n - 2); //递归调用自身
}
public static void main(String[] args) {
for (int i = 1; i < 14; i++) {
System.out.println(f(i));
}
}
}
结果:
1
1
2
3
5
8
13
21
34
55
89
144
233