古典的なJavaScriptの再帰ケースの質問の詳細な分析

古典的なJavaScriptの再帰ケースの質問の詳細な分析

再帰とは何ですか?また、どのように機能しますか?

まず再帰の定義を見てみましょう。

再帰は、関数がサブルーチンとして自身を呼び出すことで問題を解決する効率的な方法です。

簡単に言えば、プログラムが自分自身を呼び出すプログラミング手法を再帰と呼びます。再帰の考え方は、大規模で複雑な問題を段階的に、元の問題よりも規模の小さい問題に変換することです。問題がサブ問題に分割された後、サブ問題がそれ以上の再帰なしで解決できるようになるまで、再帰呼び出しが続けられます。

再帰を使用する場合は、無限ループを回避する必要があります。再帰が正しく機能するようにするには、再帰プログラムに次の 2 つのプロパティを含める必要があります。

  1. ボトムケース: ボトムケースは、プログラム呼び出しが適切なタイミングで戻り、再帰を継続しないことを保証するために使用され、それによってプログラムが終了できるようになります。
  2. 他のすべてのケースを基本ケースに分解する再帰関係。

自分自身を呼び出す関数は再帰的です。終了条件を忘れないようにしてください。そうしないと、無限ループに陥ります。

1. 合計

(1)デジタル加算

    関数 sum(n){
      (n===1)の場合{
        n=1を返す
      }
      n+sum(n-1)を返す
    }
    コンソールログ(合計(5));

実行命令

5+合計(n-1)
5+4+合計(n-1)
5+4+3+合計(n-1)
5+4+3+2の合計(n-1)
5+4+3+2+1

(2)配列の和

        関数sum(arr) {
        var len = arr.length
        長さが0の場合
          0を返す
        } それ以外の場合 (長さ == 1) {
          戻り値 arr[0]
        } それ以外 {
          arr[0] + sum(arr.slice(1)) を返す
        }
      }
      arr = [ 1, 2, 3, 4, 5 ] とします。  
      コンソールログ(合計(arr))

実行命令

1+合計(2,3,4,5)
1+2+合計(3,4,5)
1+2+3(4,5)
1+2+3+4+合計(5)
1+2+3+4+5
1+2+3+9
1+2+12
1+14
15

2. データ転送ツリー

        データ = [{
                id: "01",
                pid: "",
                "名前": "ラオ・ワン"
            },
            {
                id: "02",
                pid: "01",
                "名前": "シャオ・チャン"
            }
        ]
  関数 fn(data, rootId = '') {
            const children = [] //空の配列を定義する data.forEach(item => {
                if (item.pid === rootId) { //各アイテムのpid=rootIdが配列に追加された場合 children.push(item)
                    item.children = fn(データ、item.id)
                }
            });
            子どもを返す
        }

次のステップに進む前に、出発点として再帰ツリー変換を使用してルート PID の値を確認します。

実行命令

3. ハノイの塔

次の 3 つの列を a、b、c と設定します。a のすべてのプレートを大きいものから小さいものの順に c 列に配置することが目標です。一度に移動できるプレートは 1 つだけです。

実装のアイデア:

  1. n-1枚のプレートをaからbに移動する
  2. n 個のディスクを a から c に移動する
  3. n-1枚のプレートをbからcに移動する
        関数 fn(num, start, middle, end) {   
            if(数値>0){
                fn(数値-1,開始,終了,中間)
                console.log(開始+'====>'+終了); 
                fn(数値-1,中間,開始,終了)
            }
           }
              2 は 'a'、'b'、'c' です。

num をプレートの数とし、開始をプレート a、中間をプレート b、終了をプレート c とします。

例えば、2枚のプレートの実行順序

1. 最初の行に 2 を入れて、num>0 にします。最初の関数 fn(2-1,start,end,middle) を実行します。次に、fn(1-1,start,end,middle) を実行します。num が 0 より大きくないことを確認します。それだけでなく、fn(2-1,start,end,middle) に戻って console.log(a===>b) を出力します。

2. 2行目のconsole.log(start+'====>'+end);は直接a===>cを出力します。

3. 3行目のfn(2-1,middle,start,end)はconsole.log(b===>c)を実行し、次回fn(1-1,middle,start,end)はループに入ることができず、実行が完了します。

実行順序は少し抽象的です。本当に理解できない場合は、最も単純な考え方に従ってください。fn(num, start, middle, end)は、私たちが通常ゲームをプレイする方法です。最初の図

fn(num-1,start,middle,end) 2 番目のパラメータの位置を移動するプレートとして、4 番目のパラメータの位置を移動するターゲットとして取ります。画像を見るたびに、この数式を使用します。

ステップ 1 fn(num-1,start,end,middle) たとえば、プレートが 2 つある場合は、まず a-1 を b に配置する必要があります。

2番目のステップは、プレートaをcに配置し、console.log('a===>c')を直接出力することです。

3番目のステップは、プレートbをcに置くことです。fn(num-1,middle,start,end,)

4. フィボナッチ数列

フィボナッチ数列は黄金比数列とも呼ばれ、数学者レオナルド・ダ・フィボナッチがウサギの繁殖を例に挙げて考案したため、「ウサギ数列」とも呼ばれています。0、1、1、2、3、5、8、13、21、34、

        関数フィボナッチ(n) {
            n <= 1?1:フィボナッチ(n - 1) + フィボナッチ(n - 2) を返します。
        }

最初の 2 つを除いて、毎回、前の数字と前の 2 つの数字の合計は 3 番目の数字と等しくなります。

たとえば、数字 5 の場合、最初の項は 3 です。最初の 2 つの項は ​​2 です。3+2=5 です。

要約する

古典的な JavaScript 再帰ケースの質問の詳細な分析に関するこの記事はこれで終わりです。より関連性の高い JavaScript 再帰ケースのコンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、次の関連記事を引き続き参照してください。皆様が今後も 123WORDPRESS.COM を応援してくれることを願っています。

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

<<:  Windows10 mysql 8.0.12 非インストール版 設定 起動方法

>>:  Linux でファイルを実行するときに「そのようなファイルまたはディレクトリはありません」というプロンプトが表示される理由を深く理解する

推薦する

コンパイル、インストールから設定ファイルの説明まで、中国語でnginxの詳細な説明

この記事では、コンパイルとインストールから設定ファイルの説明まで、Nginx について詳しく紹介しま...

Ubuntu 18.04 で apt-get ソースを変更する方法

apt-get を使用してインストールすると、非常に遅くなります。国内のソースを変更すると、この問題...

MySQL データベースの型変換のための CAST 関数と CONVERT 関数の説明

MySQL のCAST()およびCONVERT()関数を使用すると、ある型の値を取得し、別の型の値を...

スプレッド演算子のサンプルコードと JavaScript での応用

スプレッド演算子を使用すると、式をある時点で展開できます。スプレッド演算子は、複数のパラメーター (...

Nginxポーリングアルゴリズムの基本的な実装方法の詳細な説明

ポーリングアルゴリズムの紹介多くの人が職場で nginx を使用しており、その設定に精通しています。...

Keras を使って SQL インジェクション攻撃を判断する (例の説明)

この記事では、ディープラーニングフレームワーク keras を使用して、SQL インジェクションの特...

MySQL 5.0.96 for Windows x86 32 ビット グリーン簡易版インストール チュートリアル

MySQL 5.0 は、いくつかの「高度な機能」があるため定番となっています。これは、Windows...

HTML タグに類似: strong および em、q、cite、blockquote

XHTML には似た機能を持つタグがいくつかあります。もちろん、ここでの類似性とは意味の類似性を指...

Nginx ドメイン転送の使用シナリオ コード例

シナリオ 1: サーバーの制限により、外部に開かれているポートは 1 つだけですが、別の外部ネットワ...

MySQL スロークエリ: スロークエリを有効にする

1. スロークエリの用途は何ですか? long_query_time を超えて実行されるすべての S...

Vueはプルダウンとスクロールでデータを読み込む例を実装しています

目次ステップ1: インストールステップ2: 引用ステップ3: 使用Webプロジェクトでは、データを読...

JSオブジェクトの走査順序の詳細な説明

JavaScript ではオブジェクトを走査する順序は固定されていないと聞いたことがある人もいるかも...

シンプルなフロントエンドのページング効果を実現する js

比較的シンプルな業務のプロジェクトもありますが、フロントエンドのページングを多用します。プラグインの...

Nginx でファイル ホットリンク保護サービスを構築する方法を学ぶ例

序文多くのサイトが、ポイントやゴールドコインなど、情報のダウンロードに料金を請求していることは誰もが...

.Net Core を使用して数千万のデータを MySQL にインポートする手順

目次事前準備実施方法: 1. 単一のデータを挿入する2. マージデータ挿入3. MySqlBulkL...