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

推薦する

ウィンドウ環境で VScode を使用して仮想マシン MySQL に接続する方法

1. 仮想マシン側1. MySQLの設定ファイルを見つける:sudo vim /etc/mysql/...

Redhat 7.3 に MySQL 8.0.22 をインストールするための詳細なチュートリアル (バイナリ インストール)

目次1. MySQLインストールパッケージをダウンロードする2. MySQLのアンインストール手順3...

Linux bash: ./xxx: バイナリ ファイルを実行できません エラー

今日、Ubuntu 用の小さなツールを顧客に送りましたが、ユーザーはそれを受け取った後、実行できませ...

Ubuntuで余分なカーネルを削除する方法

ステップ1: 現在のカーネルを表示する 読み取る $ uname -a Linux rew 4.15...

CentOS7仮想マシンで固定IPアドレスを設定する方法

私の開発環境は、VMWare 仮想マシンに CentOS をインストールし、ホスト ファイルにインタ...

Centos7 の起動プロセスと Systemd での Nginx の起動構成

Centos7 の起動プロセス: 1.post(電源投入時のセルフテスト) 電源投入時のセルフテスト...

WeChatアプレットが左右連携を実現

この記事では、WeChatアプレットの左右連動を実現するための具体的なコードを参考までに紹介します。...

JSコンストラクタとインスタンス化およびプロトタイプ導入の関係

目次1. コンストラクタとインスタンス化2. コンストラクターとインスタンス化の関係は何ですか? 3...

レスポンシブ Web デザイン手法を実装し、ウォーターフォール モデルに別れを告げる 5 つのステップ (グラフィック チュートリアル)

次の Web デザイン プロジェクトはレスポンシブにする必要があると上司をようやく納得させることがで...

Linuxの一般的なコマンドでLinuxのmoreコマンドを使用する方法

more は、最もよく使用されるツールの 1 つです。最も一般的な使用方法は、出力コンテンツを表示し...

CSS3でよく使われるスタイルの詳しい解説[基本的なテキストとフォントのスタイル]

概要: Web ページをより美しく見せるために、ここでは CSS3 でよく使用されるスタイルをいくつ...

階層化されたピラミッドを実現するための HTML+CSS の例

この記事では主に、HTML+CSS で階層化ピラミッドを実装する例を紹介し、皆さんと共有します。詳細...

Linux システムが VMware にインストールされているかどうかを確認する方法

現在の Linux システムが VMware にインストールされているかどうかを確認する方法を教えて...

CSSは固定比率のブロックレベルコンテナを簡単に実装できる

H5 レイアウトを設計する場合、通常はバナーに遭遇することになります。例えば、2:1 で表示したい場...