简单定义
1. 当一个函数用它自身来定义的时候就称为递归。
例如:f(x)=2f(x−1)+x2,f(x)=0
//java实现
public static int fx(int x){
if(x == 0) return 0;
else return 2*fx(x-1) + x * x;
}
if(x == 0) return 0;
定义了基准情况:这个时候的值可以直接算出,不用递归。若没有这行,则这个函数是没有意义的,将一直没有结果。
//错误的示例
public static int errRecur_test(int x){
if( x == 0) return 0;
return errRecur_test(x / 3 +1);
}
当输入3→errRecur_test(2)→errRecur_test(3)→errRecur_test(2),一直循环下去。程序卡死。
2.小点总结
递归的前两个基本法则
- 基准情形(base case) 要有基准情形,不用递归就能求解。
- 不断推进(making progress) 递归调用总能够朝着基准情形推进。
3.示例
有一个正整数77862,用递归将其每位逐个打印到控制台
思路:先打印7786,再打印2。想打印7786,就先打印778,再打印6。如此循环,当想打印的是个位数(<10)时,就直接打印,就是基准情况了。看下实现。
public static void printInteger(int i){
//如果i >= 10 接着调用printInteger将前面的数字打印出来
if(i >= 10) printInteger(i / 10);
//打印最后一位
//System.out.println(i % 10);
//%运算是比较耗时的
System.out.println(i - i / 10 *10);
}
4.递归的第三、四个法则
- 设计法则(design rule) 假设所有的递归都能运行。
- 合成效益 在求解一个问题的同一实例时,切勿在不同 的递归调用中做重复性的工作(之后介绍)。