递归----基础训练

时间:2022-12-05 00:16:42

递归的一些基础使用我都写在代码注释了,直接上代码吧。。。

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;
    }    
    
}