简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂问题,同时可以让代码变得简洁
列举两个小案例,来帮助大家理解递归调用机制
package com.xdr630.chapter07; public class Recursion01 { public static void main(String[] args) { T t1 = new T(); t1.test(4); } } class T{ public void test(int n){ if (n > 2){ test(n - 1); } System.out.println("n=" + n); } }
class T{ public void test(int n){ if (n > 2){ test(n - 1); }else{ System.out.println("n=" + n); } }
public class Recursion01 { public static void main(String[] args) { T t1 = new T(); int res = t1.factorial(5); System.out.println("5的阶乘 res" + res); } } class T{ public int factorial(int n){ if (n == 1){ return 1; }else{ return factorial(n - 1) * n; } } }
return 1
返回给factorial(1)
,factorial(1)x2=2
返回给 factorial(2)
,一层一层返回调用1,1,2.3.5,8,13..
给你一个整数n,求出它的值是多少思路分析
1. 当n = 1 斐波那契数 是1
2. 当n = 2 斐波那契数 是1
3. 当n >= 3 斐波那契数 是前两个数的和
4. 这里就是一个递归的思路
package com.xdr630.chapter07; public class RecursionExercise01 { public static void main(String[] args) { T1 t1 = new T1(); int n = 7; int res = t1.fibonacci(n); if(res != -1) { System.out.println("当n="+ n +" 对应的斐波那契数=" + res); } } } class T1{ 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; } } }
n=-1
时思路分析 逆推
1. day = 10 时 有 1个桃子
2. day = 9 时 有 (day10 + 1) * 2 = 4
3. day = 8 时 有 (day9 + 1) * 2 = 10
4. 规律就是 前一天的桃子 = (后一天的桃子 + 1) *2
5. 递归
public class RecursionExercise01 { //编写一个main方法 public static void main(String[] args) { T t1 = new T(); //桃子问题 int day = 10; int peachNum = t1.peach(day); if(peachNum != -1) { System.out.println("第 " + day + "天有" + peachNum + "个桃子"); } } } 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; } }
更改天数查看桃子数量的变化
当 day = -1 时: