1.基本内容
定义:递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变得简洁
能够解决的问题:各种数学问题;能够使用栈解决的问题;算法中使用
eg:将一个数减到二,递归实现阶乘
public class recursion1 { public static void main(String[] args){ T t = new T(); t.test(5); int res = t.factorial(7); System.out.println("res = " + res); } } class T{ public void test(int n){ if(n>1){ test(n-1); } System.out.println("n = " + n); } public int factorial(int n){ if (n == 1) { return 1; } else { return factorial(n - 1) * n; } } }
2.递归规则
-
执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
-
方法的局部变量是独立的,不会互相影响
-
如果方法中使用的是引用类型变量,就会共享该引用类型的数据
-
递归必须向退出递归的方向移动,否则会出现无限递归(栈溢出)
-
当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法就执行完毕
3.递归实例
1.斐波那契数列
1.当 n = 1 斐波那契数 是 1 2. 当 n = 2 斐波那契数 是 1 3. 当 n >= 3 斐波那契数 是前两个数的和
public int fibonacci(int n) { if( n >= 1) { if( n == 1 || n == 2) { return 1; } else { return fibonacci(n-1) + fibonacci(n-2); } } else { System.out.println("要求输入的 n>=1 的整数"); return -1; } }
2.猴子吃桃问题
猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个! 以后每天猴子都吃其中的一半,然后再多吃一个。当到第 10 天时, 想再吃时(即还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子? 规律就是 前一天的桃子 = (后一天的桃子 + 1) *2
public int peach(int day) { if(day == 10) {//第 10 天,只有 1 个桃 return 1; } else if ( day >= 1 && day <=9 ) { return (peach(day + 1) + 1) * 2; } else { System.out.println("day 在 1-10"); return -1; } }