JavaScriptの再帰の詳細

JavaScriptの再帰の詳細

1. 再帰とは何ですか?

関数が内部的に自分自身を呼び出すことができる場合、この関数は再帰的です。簡単に理解すると、関数は内部的に自分自身を呼び出し、この関数は再帰関数です。

以下のように表示されます。

関数fn(){
 関数fn();
}
関数fn();

この関数は再帰関数です。直接印刷すると、次のようになります。

印刷エラーが見つかりました。なぜでしょうか?再帰関数はループと同じ効果を持つためです。戻り値が与えられない場合は、無限ループが継続されます。つまり、次のことが分かります。

再帰はスタックstack overflowエラーが発生しやすいため、終了条件のreturn追加する必要があります。

正しい再帰関数を書くにはどうすればいいですか?上記のコードを例に挙げます。たとえば、「hello」を 5 回印刷したい場合は、次のように記述します。

var 数値 = 1;
関数fn(){
            console.log('こんにちは');
            if(数値 == 5){
                戻る;
            }
            数値++;
            関数fn();
        }
        関数fn();

印刷結果は次のとおりです。

再帰とは何かがわかったので、再帰を使って問題を解決する方法を見てみましょう。

2. 再帰を使って数学の問題を解く

1. 1 * 2 * 3 * 4 …*nの階乗を求めます。

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

 関数fn(n){
           (n == 1)の場合{
               1 を返します。
           }
           n*fn(n-1) を返します。
       }
       console.log('1-20の階乗は: '+fn(20));
       console.log('1-10の階乗は: '+fn(10));
       console.log('1-5の階乗は: '+fn(5));

印刷結果は次のとおりです。

2. フィボナッチ数列を見つける

フィボナッチ数列は「ウサギ数列」とも呼ばれ:、1、1、2、3、5、8、13、21、34、……,数列を指します。つまり、3 番目の項の値は前の 2 つの項の合計です。ユーザーは n を入力し、その位置の数字を取得します。

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

関数fb(n){
            n === 1 || n === 2 の場合{
                1 を返します。
            }
            fb(n-1) + fb(n-2) を返します。
        }
       console.log('3番目のフィボナッチ数の値は次のとおりです: '+fb(3));
       console.log('10番目のフィボナッチ数の値は次のとおりです: '+fb(10));

印刷結果は次のとおりです。

3. 再帰を使用して対応するデータオブジェクトを見つける

idに応じて対応するデータオブジェクトを返す

次のようなオブジェクトがあります。

        var 日付 = [{
            id:1,
            名前:「電気製品」、
            品:[{
                id: 11,
                gname:'携帯電話'
            },{
                id: 12,
                gname: 'コンピュータ'
            }]
        },{
            id:2,
            名前:「衣類」,
            品:[{
                id : 21,
                gname:'パンツ'
            },{
                id : 22,
                gname : 'コート'
                }]
        },{
            id : 3,
            名前: '食べ物'
                }];

ここで、 idを入力して、対応するデータ オブジェクトを返す必要があります。

まず、次に示すように、for...Each() を使用して配列を走査し、各値を取得します。

関数 getId(配列,id){
                    配列.forEach(関数(値){
                        console.log(値);
                    })
                }
                取得ID(日付、1);

印刷された結果は次のとおりです。

このとき、ID 1 のオブジェクトの値を取得したい場合は、次のようにします。

関数 getId(配列,id){
                    配列.forEach(関数(値){
                       if(値.id === id){
                           console.log(値);
                       }
                    })
                }
                取得ID(日付,1);

印刷結果は次のとおりです。

はい、しかし、ID 11 のオブジェクトの値を取得したい場合はどうすればよいでしょうか。明らかに、関数を直接呼び出すことは実現可能ではありません。これは、for...Each を通じて最も外側のオブジェクトの値を取得するだけで、内側のレイヤーの特定の分類は取得されないためです。このとき、getId(array,id) 関数を再帰的に呼び出すことで、内側のオブジェクトの値を取得できます。

操作は以下のとおりです。

 関数 getId(配列,id){
                    配列.forEach(関数(値){
                       if(値.id === id){
                           console.log(値);
                       }それ以外の場合(value.goods && value.goods.length != 0){
                            getId(値.商品,ID);
                       }

                    })
                }
                // getId(日付,1);
                getId(日付、11);

印刷された結果は次のとおりです。

JavaScript再帰に関するこの記事はこれで終わりです。JavaScript 再帰に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • 古典的なJavaScriptの再帰ケースの質問の詳細な分析
  • JavaScript 再帰関数の定義と使用例の分析
  • JavaScript 再帰関数の定義と使用例の分析
  • JavaScriptの再帰操作例の簡単な分析

<<:  KVM 仮想化のインストール、展開、管理のチュートリアル

>>:  ウェブページ上でデスクトップ exe プログラムを呼び出す簡単な方法

推薦する

格納可能なセカンダリメニューを実装するための JavaScript

JavaScriptで格納可能なセカンダリメニューを実装するための具体的なコードは参考までに。具体...

JavaScript関数の詳細な紹介

任意の数のステートメントを関数を通じてカプセル化することができ、いつでもどこでも呼び出して実行できま...

CSS--overflow:hidden のプロジェクト例

以下は、私のプロジェクトでこのプロパティを使用する方法の例です。 (1)激しく透明な浮遊コードをコピ...

テキストエリアの残りの単語数を動的に取得する方法

仕事で、これまで一度も書いたことのないケースに遭遇しました。午後の半分をその作業に費やし、ついに書き...

RoughViz を使用して Vue.js でスケッチされたチャートを視覚化する方法

導入チャートは、データ セットを読みやすくし、その各部分を区別しやすくするために使用されるデータのグ...

Linuxルートの初期値を設定する方法の簡単な分析

Ubuntu ではデフォルトで root ログインが許可されていないため、初期の root アカウン...

CSS+JS で水滴の波紋アニメーション ボタン効果を実装するサンプル コード

コードは次のようになります。 <!DOCTYPE html> <html lang...

Vue画像拡大鏡コンポーネントのカプセル化と使用方法の詳細な説明

Vue画像拡大鏡コンポーネントパッケージに基づいて、参考までに具体的な内容は次のとおりです。画像拡大...

MySQL の分離レベル、ロック、MVCC の紹介

この記事の目的は、これらの概念とその機能の関係を明らかにすることです。 Mysql がトランザクショ...

Workermanはmysql接続プールのサンプルコードを書きます

まず、接続プールを使用する理由と、接続プールによってどのような問題が解決できるかを理解する必要があり...

Linux の非常に詳細な gcc アップグレード プロセス

目次序文1. 現在のgccバージョン2. gccをインストールする3.gmpのインストール4.MPF...

Nginx 設定ファイルの詳細な説明と最適化の提案ガイド

目次1. 概要2. nginx.conf 1) 設定ファイルの場所2) ワーカープロセス3) イベン...

Vueカスタムコンポーネントはイベント修飾子を使用してピットレコードを踏む

序文今日、自作のコンポーネントを使っていたところ、突然、長い間忘れていたバブリングイベントに遭遇しま...