递归设计经验
1.找重复(子问题)
2.找重复中的变化量-->参数
3.找参数变化趋势-->设计出口
递归基础练习
求阶乘
private static int f1(int n) {
if (n == 1) {
return 1;
}
return n * f1(n - 1);
}
打印i~j
private static void f2(int i, int j) {
if (i > j) {
System.out.println();
return;
}
System.out.print(i + " ");
f2(i + 1, j);
}
对数组的所有元素求和
private static int f3(int[] a, int begin) {
if (begin == a.length - 1) {
return a[begin];
}
return a[begin] + f3(a, begin + 1);
}
翻转字符串
private static String f4(String str, int end) {
if (end == 0) {
return str.charAt(0) + "";
}
return str.charAt(end) + f4(str, end - 1);
}
多分支递归:斐波那契数列
等价于两个子问题:
求前一项
求前二项
两项求和
private static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
巧用递推公式解最大公约数
private static int gcd(int m, int n) {
if (n == 0) {
return m;
}
return gcd(n, m % n);
}
主函数
public static void main(String[] args) {
System.out.println(f1(4));
System.out.println("-------------");
f2(1, 10);
System.out.println("-------------");
System.out.println(f3(new int[]{1,2,3,4,5},0));
System.out.println("-------------");
System.out.println(f4("abcd",3));
System.out.println("-------------");
System.out.println(fib(6));
System.out.println("-------------");
System.out.println(gcd(9,6));
System.out.println("-------------");
}