面試中常見的算法之Java中的遞歸


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

    }

}

  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM