[Javaの王になるための道]パート5:Java SE(メソッド再帰)

a928ad769e124c43ab65cc472fed8870.gif

 

コンテンツ

 

再帰の概念

1.再帰とは何ですか?

2.再帰的な説明 

再帰の使用 

例:nの階乗を再帰的に見つける

図面分析:

例:nの合計を求めます

例:再帰的実装は、各桁を順番に出力します 

実装コード:

例:n番目のフィボナッチ数を見つける 

要約: 

私がいるから。


 

再帰の概念

1.再帰とは何ですか?

再帰は、メソッドがそれ自体でメソッドを呼び出すプロセスです。

再帰を使用するには、次の2つの前提条件があります。

1.アプローチと終了条件があります。

2.自分で呼び出します。

再帰を実装する方法は?

最も重要な方法は次のとおりです。再帰を実現するには、再帰式を導出する必要があります。

再帰的な考え方:水平思考、再帰的な公式の観点から考える。

コード実行:垂直実行。

2.再帰的な説明 

まず、次のコードを見てください。

public class TestDemo {
    public static void func(){
        
        func();   //自己调用自己本身
    }


    public static void main(String[] args) {
        func();

    }
}

上記のコードは単純な再帰です。

このコードを実行した結果を見てみましょう。

図面の説明:

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBAS-WqvuKAjQ ==、size_20、color_FFFFFF、t_70、g_se、x_16

 上図の再帰では、終了しがちな条件がまったくないため、関数は際限なく再帰します。すべての再帰はスタック上のメモリを開く必要があり、常にスタック上のメモリを開く必要があります。常にスタックオーバーフローが発生します。

古いアイアンは覚えておく必要があります。再帰に関する問題を記述したら、境界が正しくない場合は必ず報告7ae60fddda4c4c9183eef750dc310410.pngします。このエラーを報告する場合は、終了条件が間違っているか、終了条件を記述していません。再帰の過程で、深さが大きすぎて、最終的にスタックがオーバーフローします。

 

上記のコードを正しくするには、終了条件を追加する必要があります。

正しいコードは次のとおりです。

public class TestDemo {
    public static void func(int n){
        if(n == 1) return;
        func(n -1);
    }


    public static void main(String[] args) {
        func(3);

    }
}

以下では、簡単な例を通して、再帰についてより深く理解することができます。

再帰の使用 

例:nの階乗を再帰的に見つける

図面分析:

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBAS-WqvuKAjQ ==、size_20、color_FFFFFF、t_70、g_se、x_16

実装コード:

public class TestDemo {
    public static int fac(int n){
        if(n == 1) {
            return 1;
        }
        int tmp = n * fac(n - 1);
        return tmp;
    }
    public static void main(String[] args) {
        System.out.println(fac(5));

    }
}

コード図の説明:

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBAS-WqvuKAjQ ==、size_20、color_FFFFFF、t_70、g_se、x_16

例:nの合計を求めます

図面分析

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBAS-WqvuKAjQ ==、size_20、color_FFFFFF、t_70、g_se、x_16

 実装コード:

第一种写法:
public class TestDemo {
    public static int sumAdd(int n){
        if(n == 1) {
            return 1;
        }
        int tmp = n + sumAdd(n - 1);
        return tmp;
    }
    public static void main(String[] args) {
        System.out.println(sumAdd(3));

    }
}

第二种写法:
public class TestDemo {
    public static int sumAdd(int n){
        if(n == 1) {
            return 1;
        }
       
        return n + sumAdd(n -1);
    }
    public static void main(String[] args) {
        System.out.println(sumAdd(3));

    }
}

例:再帰的実装は、各桁を順番に出力します 

図面分析:

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBAS-WqvuKAjQ ==、size_20、color_FFFFFF、t_70、g_se、x_16

 実装コード:

public class TestDemo {

    public static void print(int n){
        if(n < 10){
            System.out.print(n+" ");
        }else{
            print(n/10);
            System.out.print(n%10+" ");
        }
    }
    public static void main(String[] args) {
        print(1234);


    }
}

例:非負の整数を取り、それを構成する数値の合計を返す再帰メソッドを記述します。例:1729と入力すると、1 + 7 + 2+9が返されます。

実装コード:

public class TestDemo {


    public static int sumEveryone(int n){
        if(n < 10){
           return n;
        }else{
            return n%10 + sumEveryone(n/10);
        }
    }

    public static void main(String[] args) {
        System.out.println(sumEveryone(7910));

    }

}

例:n番目のフィボナッチ数を見つける 

図面分析:

透かし、type_d3F5LXplbmhlaQ、shadow_50、text_Q1NETiBAS-WqvuKAjQ ==、size_20、color_FFFFFF、t_70、g_se、x_16

実装コード:

第一种方法:递归
public class TestDemo {
    public static int fib(int n){
        if(n == 1 || n == 2){
            return 1;
        }else{
            return fib(n-2)+fib(n-1);
        }
    }
    public static void main(String[] args) {
        System.out.println(fib(5));

    }



第二种方法:叫做循环(迭代)实现
    public static int fib2(int n){
        if(n == 1 || n==2){
            return 1;
        }
            int f1 = 1;
            int f2 = 1;
            int f3 = 0;
            for (int i = 3; i < n; i++) {
                f3 = f1+f2;
                f1 = f2;
                f2 = f3;
            }
            return f3;

    }
    public static void main(String[] args) {
        System.out.println(fib2(45));

    }

要約: 

この記事では、再帰とは何か、再帰を説明する方法、および再帰の使用方法を簡単に紹介します。簡単な例で再帰の印象を深めます。以上が本日の内容です。ご不明な点がございましたら、いつでも非公開でメッセージをお送りいただけます。記事の問題点は積極的に修正いたします。また、皆様のご希望の知識をより早く習得していただきたいと思いますので、一緒に頑張りましょう!

あなたと一緒です。_

23ed9e1109544bcb98ce1bb86bc1f9a0.gif

 

 

 

 

 

 

おすすめ

転載: blog.csdn.net/m0_64397675/article/details/123190108