1 /* 2 * 递归:方法定义中调用方法本身的现象 3 * 4 * 方法的嵌套调用,这不是递归。 5 * Math.max(Math.max(a,b),c); 6 * 7 * public void show(int n) { 8 * if(n <= 0) { 9 * System.exit(0); 10 * } 11 * System.out.println(n); 12 * show(--n); 13 * } 14 * 15 * 注意事项: 16 * A:递归一定要有出口,否则就是死递归 17 * B:递归的次数不能太多,否则就内存溢出 18 * C:构造方法不能递归使用 19 * 20 * public DiGuiDemo() { 21 * DiGuiDemo(); 22 * } 23 * 24 * 举例: 25 * A:从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是: 26 * 从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是: 27 * 从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是: 28 * 从前有座山,山里有座庙,庙里有个老和尚和小和尚,老和尚在给小和尚讲故事,故事是: 29 * ... 30 * 出口: 庙挂了,或者山崩了 31 * B:学编程 -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费 32 * 学编程 -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费 33 * 学编程 -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费 34 * 学编程 -- 高薪就业 -- 挣钱 -- 娶媳妇 -- 生娃娃 -- 放羊 -- 挣学费 35 * ... 36 * 出口:娶不到媳妇或者生不了娃娃 37 */ 38 39 40 package zl_DiGui; 41 /* 42 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少? 43 分析: 44 兔子对数 45 第一个月: 1 46 第二个月: 1 47 第三个月: 2 48 第四个月: 3 49 第五个月: 5 50 第六个月: 8 51 1,1,2,3,5,8... 52 规则: 53 A:从第三项开始,每一项都是前两项之和 54 B:第一第二项都是已知的 55 方法: 56 A:数组 57 B:变量的变化实现 58 第一个月 a=1,b=1; 59 第二个月 a=1,b=2; 60 第三个月 a=2,b=3; 61 第四个月 a=3,b=5; 62 ... 63 每个月的a,是上个月的b,每个月的b,是上个月的a+b 64 C:递归 65 a:返回类型 int 66 b:参数列表 int n (月份) 67 c:出口:n = 1 || n ==2 时,就是第一个月或第二个月时 68 69 */ 70 public class DiGuiDemo1 { 71 72 public static void main(String[] args) { 73 74 //第一种方法:数组 75 int[] ary = new int[20]; 76 ary[0] = 1; 77 ary[1] = 1; 78 79 for(int x = 2; x < ary.length ; x ++){ 80 ary[x] = ary[x - 1] + ary [x - 2]; 81 } 82 System.out.println(ary[19]); 83 84 //第二种方法:变量的变化实现 85 int a = 1; 86 int b = 1; 87 for(int y = 3 ; y <= 20 ; y ++){ 88 int temp = a; 89 a = b; 90 b = temp + a ; 91 } 92 System.out.println(b); 93 94 //调用递归 95 System.out.println(digui(20)); 96 } 97 //递归 98 public static int digui(int n ) { 99 if(n == 1 || n == 2){ 100 return 1; 101 }else{ 102 return digui(n-1) + digui(n-2); 103 } 104 } 105 }
递归解决问题的思想及图解
递归求阶乘的代码实现及内存图解