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

推薦する

Vue プロジェクトにインターフェース リスニング マスクを追加する方法

1. 事業背景マスク レイヤーを使用してユーザーの異常な操作を遮断する方法は、フロントエンドでよく使...

MySQL 8.0.11 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0のインストールと設定方法は参考までに。具体的な内容は以下のとおりです。ダウンロード...

Vue3 の参照と参照の詳細

エディターは、Vue3のデータの関連する問題も共有します。次のような例を見てみましょう。 Vue.c...

nginxとバックエンドポート間の競合の解決策

質問: Alice 管理システムを開発しているときに、すべてのバックエンド インターフェイスが最初の...

MySQLがトランザクション分離を実装する方法の簡単な分析

目次1. はじめに2. RC および RR 分離レベル2.1. RRトランザクション分離レベルでのク...

Windows10システムにMySQL 5.7.17をインストールする

オペレーティング システム win10 MySQL は、公式 Web サイトからダウンロードした 6...

MySQL CHARとVARCHARの選択方法

目次VARCHAR 型と CHAR 型結論: VARCHAR 型と CHAR 型VARCHAR と ...

さまざまなHTTPリターンステータスコードの詳細な説明

サイト上のページを表示するためのリクエストがサーバーに送信されると(たとえば、ユーザーがブラウザでペ...

Vue ElementUI フォームのフォーム検証

フォーム検証は、フロントエンド開発プロセスで最もよく使用される機能の 1 つです。私の個人的な仕事経...

MySQL のバックアップとリカバリの設計アイデア

背景まず、背景を説明します。ある制約により、当社の現在のバックアップ戦略では、1 日おきにフル バッ...

レスポンシブなカードホバー効果を実現するための HTML+CSS

目次成し遂げる:要約:言うことはあまりありませんが、まずは効果を見てみましょう。 カードホバー、レス...

Nginx 正規表現の詳細な説明

Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...

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

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

Docker コンテナを他のサーバーに移行する 5 つの方法

多くの場合、移行は避けられません。ハードウェアのアップグレード、データ センターの変更、古いオペレー...

Linux コマンドにおける Ctrl+z、Ctrl+c、Ctrl+d の違いと使い方

Linux で Ctrl+c、Ctrl+d、Ctrl+z はどういう意味ですか? Ctrl+c と ...