递归:
1、找重复
2、找重复中的变化量(参数)
3、找参数变化趋势(设计出口)
方法或函数的内部调用了自己就是递归(栈结构)
递归基础练习:
切蛋糕的思想,切掉一小部分,剩下的给别人
先找自己做的那部分,再找程序出口
1、求一个数的阶乘
/*找重复 n*(n-1)的阶乘,将f1(int m)的功能就看为是求阶乘的,所以m直接乘以f(m-1)
找变化,变化的量应该作为参数
找边界:出口 到1
*/
private static long f1(int m) {
if (m == 1) {
return m;
}
return m*f1(m-1);
}
2、打印从i到j
我只做打印i (从这切开),剩下的交给别人
/*打印i到j
/*找重复
找变化,变化的量应该作为参数
找边界:出口 i>j
* 我做一部分,剩下的交给其他人做*/
private static void f2(int i, int j) {
if (i>j)
return;
System.out.println(i);
f2(i+1,j);
}
3、数组求和
我只做第一个元素相加后面的数组元素,剩下的交给别人
/*数组求和,加参数
* 找重复 我做一部分,剩下的交给其他人做,最简单的就是我只做第一个元素相加后面的数组元素
找变化,变化的量应该作为参数
找边界:出口 下标到最后*/
private static long f3(int[] arr,int begin) {
if (begin==arr.length-1)
return arr[begin];
return arr[begin]+f3(arr,begin+1);
}
4、反转字符串
这个从后面切
/*翻转字符串
* 切蛋糕思想,我只做一部分,剩下的交给其他人,这样找出重复部分,
* 之后再找程序的出口 end是字符串的下标索引,从0开始**
*/
public static String reverse(String src,int end){
if (end==0){
return ""+src.charAt(0);
}
return src.charAt(end)+reverse(src,end-1);
}
5、斐波那契数列
递归可以分解为
1、直接量+ 小规模子问题(上面的例子,只切一个很小的直接量蛋糕,划一刀)
2、多个小规模子问题(本例子就是 f(n-1)+f(n-2) )
n是第几项
public static void main(String[] args) {
//求第五项
long t = fib(5);
System.out.println(t);
}
public static long fib(int n){
//当是第一项或者第二项的时候
if (n==1 || n==2){
return 1;
}
return fib(n-1)+fib(n-2);
}
上面的几个例子都是单分支(只有一个分支),而斐波那契数列是两分支(找了两个小弟)
斐波那契数列的运算顺序