一、输出问题案例
public class Recursion01 {
public static void main(String[] args) {
T t=new T();
t.test(5);
}
}
class T{
public void test(int n){
if(n>2){
test(n-1);
}
System.out.println("n="+n);
}
}
输出结果:
代码分析:main()方法创建T对象,test(5)入栈,∵5>2->test(4)入栈,直到n=1时达到递归出口,此时系统栈中内容为:
test(2)
test(3)
test(4)
test(5)
由于栈后进先出的特性,先调用test(2),n>2不成立终止递归执行输出代码,此时n=2,得到输出结果。其余方法依次出栈并输出对应结果。
二、阶乘问题案例
public class Recursion01 {
public static void main(String[] args) {
int result= t.factorial(5);
System.out.println("阶乘结果为:"+result);
}
}
class T{
public int factorial(int n){
if(n==1){
return 1;
}
return n*factorial(n-1);
}
}
代码分析:main()方法创建T对象,factorial(5)入栈,∵5!=2->factorial(4)入栈,直到n==1时达到递归出口,此时系统栈中内容为:
factorial(1)------结束factorial(1),返回factorial(1)=1
factorial(2)------结束factorial(2),返回factorial(2)=2*factorial(1)=2
factorial(3)------结束factorial(3),返回factorial(3)=3*factorial(2)=3*2=6
factorial(4)------结束factorial(4),返回factorial(4)=4*factorial(3)=4*6=24
factorial(5)------结束factorial(5),返回factorial(5)=5*factorial(4)=5*24=120
栈中方法全部结束,返回factorial(5)
三、递归使用规则
1.每执行一个方法,都要入系统栈
2.每个方法的局部变量独立,不受其他方法影响。
3.递归函数形参只能是基本数据类型。用引用数据类型会共享使用。
4.递归必须向递归出口逼近,否则会栈溢出。
5.当方法执行完毕,或者遇到return时,就会返回。返回给谁呢?谁调用的就返回给谁。返回之后呢,这个方法就出栈,释放系统栈空间。
四、使用递归思路(正向):
1.寻找递归出口(写到if语句里)<可能有多个>
2.编写递归体:根据题设编写
五、使用递归思路(逆向)
根据题设找出规律,找出紧挨着的两天的关键值得关系,构造递归函数。(难)
六、递归习题
1.斐波那契数列
public class Recursion02 {
public static void main(String[] args) {
V v=new V();
System.out.print( v.Fibonacci(5));
}
}
class V{
int Fibonacci(int n){
if(n==1) return 1;
if(n==2) return 1;
return Fibonacci(n-1)+Fibonacci(n-2);
}
}
2.猴子吃桃子问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃了一个!以后每天猴子都吃其中的一半,然后再多吃一个。当到第 10 天时,想再吃时(即还没吃),发现只有 1 个桃子了。问题:最初共多少个桃子?
public class Recursion03 {
public static void main(String[] args) {
Z z=new Z();
int peaches=z.peaches(1);
System.out.println(peaches);
}
}
class Z{
//前一天的桃子=(后一天的桃子+1)*2
int peaches(int day){
if(day==10){
return 1;
}else if(day>=1&&day<=9){
return (peaches(day+1)+1)*2;
}else{
System.out.println("day只能在1-10");
return -1;
}
}
}