1、方法定義中調用方法本身的現象
2、遞歸注意實現
1) 要有出口,否則就是死遞歸
2) 次數不能太多,否則就內存溢出
3) 構造方法不能遞歸使用
3、遞歸解決問題的思想和圖解:
分解和合並【先分解后合並】
1. 常見的斐波那契數列
1,1,2,3,5,8,13,21,...
特征: 從第三個數開始,每個數是前兩個數的和。
int count = 0; private int getFibo(int i) { if (i == 1 || i == 2) { count = count+1; System.out.println("第" +count+"次進行運算 並返回結果1" ); return 1;} else { count = count+1; System.out.println("第" +count+"次進行運算 "+ "getFibo("+(i - 1)+")"+" + getFibo("+(i - 2)+")"); return getFibo(i - 1) + getFibo(i - 2); } } @Test public void test01() { int value = getFibo(6); System.out.println(value); }
2. 階乘
10!= 10 * 9 * 8 * 7 * (... )* 1
9! = 9 * 8 * 7 * (... )* 1
8! = 8 * 7 * (... )* 1
特征:
9!=9* 8!
10! =10 * 9!
//階乘 private int get(int i){ int result = 1; if (i == 1) { count = count+1; System.out.println("第" +count+"次進行運算 並返回結果* 1" ); result = result * 1; } else { count = count+1; System.out.println("第" +count+"次進行運算" + "get(" +(i-1)+")" ); result = i * get(i-1); } return result; } @Test public void test01() { //System.out.println(getFibo(6)); System.out.println(get(5)); }
3. 加法實現1+2+3+4+5+...+100=
//求和 private int fsum(int i){ if (i <= 0) { count = count+1; System.out.println("第" +count+"次進行運算並返回0" ); return 0; } else { count = count+1; System.out.println("第" +count+"次進行運算且返回 " + i +" + fsum(" +(i-1)+")" ); return (i + fsum(i-1)); } } @Test public void test01() { //System.out.println(getFibo(6)); //System.out.println(get(5)); System.out.println(fsum(10)); }
4. 實現打印乘法表
//打印乘法表 //for 循環實現 private void getByFor(int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { System.out.print(i+" * "+j+" = "+i*j+" "); } System.out.println(); } } //打印乘法表 //遞歸實現 public static void getByRecursion(int n) {//遞歸 實現 if (n == 1) { System.out.println("1 * 1 = 1 "); } else { getByRecursion(n-1); for (int j = 1; j <= n; j++) { System.out.print(n+" * "+j+" = "+n*j+" "); } System.out.println(); } } @Test public void test01() { //System.out.println(getFibo(6)); //System.out.println(get(5)); //System.out.println(fsum(10)); getByFor(8); getByRecursion(9); }
6. 漢諾塔游戲
三根木棒,n個依次增大的空心圈圈,每次移動一個圈圈到木棒上,且任何時候保證小的圈圈不能被大的圈圈壓在下面。
2的n次方-1
//5. 漢諾塔(又稱河內塔)問題其實是印度的一個古老的傳說 public int hanio(int n,char a,char b,char c) { if (n == 1) { System.out.println( n + "號盤子從" + a + "到" + c); count = count+1; return count; } else { count = count+1; hanio(n - 1, a, c, b);//把上面n-1個盤子從a借助b搬到c System.out.println("移動" + n + "號盤子從" + a + "到" + c);//緊接着直接把n搬動c hanio(n - 1, b, a, c);//再把b上的n-1個盤子借助a搬到c return count; } } @Test public void test01() { //System.out.println(getFibo(6)); //System.out.println(get(5)); //System.out.println(fsum(10)); //getByFor(8); //getByRecursion(9); int count =hanio(3,'A','B','C'); System.out.println(count); }
代碼:
package com.example.demo; import org.junit.Test; public class Test02 { int count = 0; //1. 斐波那契數列遞歸,用的時候請將count和輸出System.Out去除 private int getFibo(int i) { if (i == 1 || i == 2) { count = count+1; System.out.println("第" +count+"次進行運算 並返回結果1" ); return 1;} else { count = count+1; System.out.println("第" +count+"次進行運算 "+ "getFibo("+(i - 1)+")"+" + getFibo("+(i - 2)+")"); return getFibo(i - 1) + getFibo(i - 2); } } //2. 階乘 private int get(int i){ int result = 1; if (i == 1) { count = count+1; System.out.println("第" +count+"次進行運算並返回result * 1" ); result = result * 1; } else { count = count+1; System.out.println("第" +count+"次進行運算且返回 " + i+" * get(" +(i-1)+")" ); result = i * get(i-1); } return result; } //3. 求和 private int fsum(int i){ if (i <= 0) { count = count+1; System.out.println("第" +count+"次進行運算並返回0" ); return 0; } else { count = count+1; System.out.println("第" +count+"次進行運算且返回 " + i +" + fsum(" +(i-1)+")" ); return (i + fsum(i-1)); } } //打印乘法表 //for 循環實現 private void getByFor(int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { System.out.print(i+" * "+j+" = "+i*j+" "); } System.out.println(); } } //打印乘法表 //4. 遞歸實現 public void getByRecursion(int n) {//遞歸 實現 if (n == 1) { System.out.println("1 * 1 = 1 "); } else { getByRecursion(n-1); for (int j = 1; j <= n; j++) { System.out.print(n+" * "+j+" = "+n*j+" "); } System.out.println(); } } //5. 漢諾塔(又稱河內塔)問題其實是印度的一個古老的傳說 public int hanio(int n,char a,char b,char c) { if (n == 1) { System.out.println( n + "號盤子從" + a + "到" + c); count = count+1; return count; } else { count = count+1; hanio(n - 1, a, c, b);//把上面n-1個盤子從a借助b搬到c System.out.println("移動" + n + "號盤子從" + a + "到" + c);//緊接着直接把n搬動c hanio(n - 1, b, a, c);//再把b上的n-1個盤子借助a搬到c return count; } } @Test public void test01() { //System.out.println(getFibo(6)); //System.out.println(get(5)); //System.out.println(fsum(10)); //getByFor(8); //getByRecursion(9); int count =hanio(3,'A','B','C'); System.out.println(count); } }
package com.example.demo; import org.junit.Test; public class Test03 { int count = 0; //1. 斐波那契數列遞歸,用的時候請將count和輸出System.Out去除 private int getFibo(int i) { if (i == 1 || i == 2) { return 1;} else { return getFibo(i - 1) + getFibo(i - 2); } } //2. 階乘 private int get(int i){ int result = 1; if (i == 1) { result = result * 1; } else { result = i * get(i-1); } return result; } //3. 求和 private int fsum(int i){ if (i <= 0) { return 0; } else { return (i + fsum(i-1)); } } //打印乘法表 //for 循環實現 private void getByFor(int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { System.out.print(i+" * "+j+" = "+i*j+" "); } System.out.println(); } } //打印乘法表 //4. 遞歸實現 public void getByRecursion(int n) {//遞歸 實現 if (n == 1) { System.out.println("1 * 1 = 1 "); } else { getByRecursion(n-1); for (int j = 1; j <= n; j++) { System.out.print(n+" * "+j+" = "+n*j+" "); } System.out.println(); } } //5. 漢諾塔(又稱河內塔)問題其實是印度的一個古老的傳說 public int hanio(int n,char a,char b,char c) { if (n == 1) { System.out.println( n + "號盤子從" + a + "到" + c); count = count+1; return count; } else { count = count+1; hanio(n - 1, a, c, b);//把上面n-1個盤子從a借助b搬到c System.out.println("移動" + n + "號盤子從" + a + "到" + c);//緊接着直接把n搬動c hanio(n - 1, b, a, c);//再把b上的n-1個盤子借助a搬到c return count; } } @Test public void test01() { System.out.println(getFibo(6)); System.out.println(get(5)); System.out.println(fsum(10)); getByFor(8); getByRecursion(8); int count =hanio(3,'A','B','C'); System.out.println(count); } }