算法之 遞歸

--------遞歸在程序語言中簡單的理解是:方法自己調用自己

一、簡單遞歸

描敘

遞歸就是自己調用自己,不過需要注意的地方,需要給定跳出條件
在這裏插入圖片描述

代碼示例

/**
 * 1、簡單遞歸
 */
public class test1 {

    public static void main(String[] args) {
        fa(100);
    }


    public static void fa(int i) {
        if (i == 0) {
            return;
        }
        System.out.println(i);
        fa(i-1);
    }
}

二、三角數字遞歸

描敘

什麼是三角數字
n個三角數字是 由 1+2+3…+n 所得值計算一個典型的三角數字。

  • 1 的三角數字是1
  • 2 的三角數字是 1+2 =3
  • 3 的三角數字是 1 + 2 + 3 = 6
  • 4 的三角數字是 1 + 2 + 3 + 4 = 10

下面通過代 計算 1+2+3…+n 所得值爲多少

代碼示例

package recursion;

/**
 * 2、三角數字遞歸
 * <p>
 * 首先大家應該知道什麼是三角數字,三角數字的定義就是:
 * 滴n個三角數字是 由 1+。。。+n所得。
 * ........
 * 例如:
 * 1 的三角數字是1
 * 2 的三角數字是 1+2 =3
 * 3 的三角數字是 1 + 2 + 3 = 6
 * 4 的三角數字是 1 + 2 + 3 + 4 = 10
 * ..................................
 * 公式=   n= n+( n-1) 
 */
public class test2 {

    public static void main(String[] args) {
        System.out.println("1 的三角數字是" + fa(1));
        System.out.println("2 的三角數字是" + fa(2));
        System.out.println("3 的三角數字是" + fa(3));
        System.out.println("4 的三角數字是" + fa(4));
    }


    /**
     * @param i
     */
    public static int fa(int i) {
        if (i == 1) {
            return 1;
        } else {
            return i + fa(i - 1);    // 4 +  3  + 2  +  1 (  1 是  (i == 1) 處的 1 )
        }
    }

}


三、Fibonacci 樹列遞歸 ( 斐波那契數列)

描敘

斐波那契數列就是典型的樹列遞歸, 又名兔子數列 ,指的是這樣一個數列:0,1、1、2、3、5、8、13、21、34、……

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲“兔子數列”,指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波那契數列以如下被以遞推的方法定義:F(1)=1,F(2)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,爲此,美國數學會從 1963 年起出版了以《斐波納契數列季刊》爲名的一份數學雜誌,用於專門刊載這方面的研究成果。

代碼示例

package recursion;

/**
 * 3、Fibonacci 樹列遞歸 (斐波那契數列 = 兔子數列),指的是這樣一個數列:0,1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞歸的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)。
 * <p>
 * 兔子問題,已知: 有一對剛出生的兔子,兔子從出生後的第三個月起開始每月生出一對小兔子,生成的小兔子第三個月起也開始每月生小兔子,假如兔子不會死,問20個月後兔子總數?
 * <p>
 * 第一月  1 (1)
 * 第二月  1
 * 第三月  2   一月生 1 對( 1+ 1 = 2)  --> 生出1對
 * 第四月  3   一月生 1 對( 2+ 1 = 3)  --> 生出1對
 * 第五月  5   一月生 1 對,三月生 1 對 ( 3 + 1+ 1 = 3)   --> 生出2對
 * 第六月  8   一月生 1 對,三月生 1 對,四月生 1 對  ( 5+1+1+1 = 8)   --> 生出3對
 * 第七月  13  一月生 1 對,三月生 1 對,四月生 1 對,五月生 2對  ( 8+ 1+1+1 +2 = 13)   --> 生出5對
 * </p>
 * 公式: 當前月數量 = 上1月 + 上2月 , 出生數量= 上2月
 * <p>
 * F0 = 0; F1 = 1; Fn = Fn-1 + Fn-2
 */
 
public class test3 {
    public static void main(String[] args) {
        //rabbit();
        System.out.println(fib(24));
    }


    /**
     * 使用遞歸
     */
    public static int fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        } else {
            // 公式: 當前月數量 = 上1月 + 上2月 ,  System.out.println("第 " + n + "月出生" + num + "對, 總數量" + num + ",");
            return fib(n - 1) + fib(n - 2);
        }
    }


    /**
     * 使用循環
     */
    public static void rabbit() {
        System.out.println("第 1 個月兔子數 1 對");
        System.out.println("第 2 個月兔子數 1 對");
        int f1 = 1;
        int f2 = 1;
        int M = 24;
        int x;
        for (int i = 3; i <= M; i++) {
            x = f2;         // 上月總數
            f2 = f1 + f2;   // 本月總數 = 上月總數 + 上上月總數
            f1 = x;         // 把上月總數 定義成 下次循環的上上月總數
            System.out.println("第 " + i + " 個月兔子數 " + f2 + " 對");
        }
    }
}


本文到此結束,如果覺得有用,勞煩各位點贊關注一下唄,將不定時持續更新更多的內容…,感謝大家的觀看!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章