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

推薦する

初心者がHTMLタグを学ぶ(3)

HTML に触れる初心者は、いくつかの HTML タグを学びます。関連記事:初心者が学ぶ HTML...

1 つの記事で v-model とその修飾子を学ぶ

目次序文v-model の修飾子:怠け者トリム番号さまざまな入力タイプやその他の要素での v-mod...

Linuxでawkを使用する方法の詳細な説明

awk を学ぶ前に、sed、grep、tr、cut などのコマンドを学んでおく必要があります。これら...

Hタグはウェブページ制作において適切に使用すべきである

HTML タグには、ページのタイトルを処理するための特別なタグがあります。これらは h1、h2、h3...

Vue のデータ応答性に関する詳細な理解

目次1. ES 構文のゲッターとセッター2. ES構文でのdefineProperty 3. Vue...

WeChat アプレット uniapp は左スワイプによる削除効果を実現します (完全なコード)

WeChatアプレットuniappは左スワイプで削除効果を実現成果を達成する1. スワイプしてリス...

TypeScript 環境を構築して VSCode にデプロイする詳細な手順

目次TypeScript環境の構築ステップ1: Taobaoミラーをダウンロードするステップ2: T...

CSS を使用して適応型の幅と高さを持つ 16:9 の長方形を実装する例

先ほど、適応幅と高さが1:1の正方形を作成する方法について説明しました。 https://www.j...

vue-element-admin プロジェクトのインポートとエクスポートの実装

vue-element-admin インポートコンポーネントのカプセル化テンプレートとスタイルまず、...

Linux で Ceph 分散ソフトウェアをインストールして使用する方法に関するチュートリアル

目次序文1. 基本環境1. サービス配信2. ネットワーク構成(全ノード) 3. SSHパスワードフ...

Linux システムで Code Cloud にプロジェクトをアップロードする方法

Code Cloudで新しいプロジェクトtest1を作成します。 公開鍵を取得するには次のコマンドを...

Reactコンポーネントのライフサイクル機能についての簡単な説明

React コンポーネントのライフサイクル機能とは何ですか?ライフサイクル関数は、ES6 構文クラス...

CSS ロリポップを描くサンプルコード

背景: 毎日少しずつ進歩し、少しずつ積み重ねていけば、どんどん良くなっていきますコード: <!...

Docker環境でJenkinsを設定すると、タスクをビルドするときにコンソールログに文字化けした中国語の文字が表示されます

目次1. 問題の説明: 2. Jenkins設定のトラブルシューティング3. コードログのエンコード...

Kubernetes オブジェクトボリュームの詳細な使用方法

概要ボリュームは、さまざまなストレージ リソースを抽象化および仮想化したものです。ストレージ リソー...