1. 程式人生 > >遞迴----基礎訓練

遞迴----基礎訓練

遞迴的一些基礎使用我都寫在程式碼註釋了,直接上程式碼吧。。。

public class Test {

    public static void main(String[] args) {
        
    }
    
    /**
     * 遞迴寫法
     * @param i
     */
    static void f(int i){
        f(i-1);
    }
    
    /**
     * 遞迴兩種解法:1、找到一種劃分方法  2、遞推公式 等價轉換
     * f(n)求n的階乘  ---> f(n-1) 求n-1的階乘
     * 找重複  n*(n-1)的階乘  求n-1的階乘是原問題的重複(規模重複) ---子問題
     * 找變化:變化的量應該作為引數
     * 找邊界:出口
     * 
@param i */ static int f1(int n){ if (n==1) { return 1; } return n*f1(n-1); } /** * 列印i到j */ static void f2(int i,int j){ if (i>j) { return ; } System.out.println(i); f2(i
+1, j); } /** * 陣列求和 * 難點就是加引數 * @param arr * @param begin * @return */ static int f3(int []arr,int begin){ if (begin==arr.length-1) { return arr[begin]; } return arr[begin]+f3(arr, begin+1); }
/** * 難點就是加引數 * 翻轉字串 */ static String reverse(String src,int end){ if (end == 0) { return ""+src.charAt(0); } return src.charAt(end)+reverse(src,end-1); } /** * 多分支遞迴 斐波那契數列 * 遞迴分解為:直接量+小規模子問題 或者 多個小規模子問題 * 遞迴基本都可以寫出遞推公式 * 遞迴本質:遞推公式 */ static int fib(int n){ if (n==1 || n==2) { return 1; } return fib(n-1)+fib(n-2); } /** * 巧用遞推公式解最大公約數 * 遞推公式 等價轉換 */ static int gcd(int m,int n){ if (n==0) { return m; } return gcd(n, m%n); } /** * 別有洞天:遞迴形式進行插入排序 */ static void insertSort(int []arr,int k){ if (k==0) { return ; } // 劃分兩個部分 第一個部分 對前k-1個元素排序 insertSort(arr, k-1); // 第二個部分 把位置k的元素插入到前面的部分 int x = arr[k]; int index = k - 1; while(index>-1&&x<arr[index]){ arr[index+1] = arr[index]; index--; } arr[index+1] = x; } }