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 プログラムを呼び出す簡単な方法

推薦する

MySQL ifnull のネスト使用手順

MySQL ifnull のネストされた使用ifnull をネストする方法があるかどうかオンラインで...

MySQLのexecute、executeUpdate、executeQueryの違い

execute、executeUpdate、executeQuery の違い (およびそれらの戻り値...

MySQL 操作: JSON データ型の操作

前回の記事では、MySQL データ保存手順パラメータの詳細な例を紹介しました。今日は、JSON デー...

iframeフレームはIEブラウザで白い背景を透明に設定します

最近、プロジェクトを進める過程で、ページの階層構造を描画するために iframe を頻繁に使用する必...

JS を使用してファイルを操作する (FileReader は --node の fs を読み取ります)

目次JS はファイルを読み取る FileReader書類イベントとメソッド基本的な使い方イベント処理...

Docker 実行時にユーザーとグループを管理する方法

Docker はプロセスを中核としてシステムリソースを分離する管理ツールです。分離は、オペレーティン...

初心者向け入門チュートリアル: ドメイン名の解決とバインディング

では、ドメイン名を登録して仮想ホストを購入した後、IE でドメイン名を入力して Web サイトを開く...

blockquote タグの使用に関する注意

<br />セマンティクス化は一言で説明することはできないし、まだ公式かつ厳密な定義もあ...

mysql はフィールドコンテンツの一部を置き換え、mysql は関数 replace() を置き換えます。

[mysql] replace の使用方法 (フィールドの内容の一部を置き換える) [mysql]...

MySQLの基本を素早く学ぶ

目次SQLを理解するSELECTを理解するエイリアス定数をクエリし、固定定数列を追加します。重複行を...

ポップアップ効果を実現するにはjsを使用します

この記事の例では、ポップアップ効果を実現するためのjsの具体的なコードを参考までに共有しています。具...

JPG、GIF、PNGなどのさまざまな画像形式の詳細な説明

ウェブページ上の画像が一般的に jpg、gif、png 形式であることは誰もが知っています。それらの...

CentOS 6.6 ソースコードのコンパイルと MySQL 5.7.18 のインストールチュートリアルの詳細な説明

1. ユーザーとグループを追加する1. mysqlユーザーグループを追加する # グループ追加mys...

タブバーのいくつかの実装方法(推奨)

タブ: カテゴリ + 説明タグバー: カテゴリ => ユーザーに現在地と目的地を知らせる1. ...

MySQL でタイムゾーンを表示および変更する方法

今日、プログラムが間違った時刻を挿入し、フィールドがデフォルト値 CURRENT_TIMESTAMP...