検索
ホームページウェブフロントエンドjsチュートリアル再帰とは何ですか? JavaScriptの再帰の詳しい説明

再帰とは何ですか? JavaScriptの再帰の詳しい説明

Oct 26, 2018 pm 04:03 PM
javascriptフロントエンドアルゴリズム再帰

この記事の内容は、再帰とは何ですか? JavaScript の再帰についての詳細な説明は、参考になると思います。

1. 再帰とは何ですか?

再帰の概念は非常に単純で、「自分自身を呼び出す」です (以下の例として関数を取り上げます)。

再帰を分析する前に、JavaScript の「コールスタック」の概念を理解する必要があります。

2. スタックのプッシュとポップ

スタックとは何ですか?メモリ内の特定の領域を箱に例えると、この領域がスタックをプッシュすることになります。したがって、最初に置くものは箱の底に置き、最後に置くものは箱の上部に置きます。ボックスから何かを取り出すことは、*スタックからそれを押し出すこととして理解できます。

つまり、私たちは物事を上から下へ運ぶ習慣があるという結論に達しました。最初に置くものは箱の底で、最後に手に入れるものです。

JavaScript では、関数が呼び出されたときにスタック プッシュが発生します。Pop は、return キーワードを含む文が見つかった場合、または実行が終了した場合にのみ発生します。

例を見てみましょう。このコードの実行順序は何でしょうか?

function fn1() {
    return 'this is fn1'
}

function fn2() {
    fn3()
    return 'this is fn2'
}

function fn3() {
    let arr = ['apple', 'banana', 'orange']
    return arr.length
}

function fn() {
    fn1()
    fn2()
    console.log('All fn are done')
}

fn()

一連のスタックのプッシュとポップの動作が上記で発生しました:

1. まず、最初はスタック (ボックス) が空です

2 関数 fn が実行されます。 、fn が最初にスタックにプッシュされ、スタックの一番下に配置されます (ボックス)

3。関数 fn 内では、関数 fn1 が最初に実行され、fn1 が fn

# の上のスタックにプッシュされます。 ##4. 関数 fn1 が実行され、return キーワードに移動すると、これが fn1 になり、fn1 がスタックからポップされ、ボックス内には fn

5 だけが残ります。 fn の場合、fn1 が実行された後、関数 fn2 の実行が開始され、fn2 がスタックにプッシュされますが、fn2 の内側で fn3 が検出されると、fn3 の実行が開始されるため、fn3 がスタックにプッシュされます

6. このとき、スタック内での順序は、 fn3 7。キーワードが関数 fn3 内で検出され、fn3 は実行後にスタックから飛び出し、関数 fn2 に戻ります。fn2 も return キーワードに遭遇し、スタックから飛び出し続けます。

8. スタックには fn だけが存在します。console.log('All fn arened') ステートメントを実行すると、fn がスタックから飛び出します。

9. これでスタックは再び空になりました。

上記の手順は人々を混乱させやすいので、フローチャートを次に示します:

再帰とは何ですか? JavaScriptの再帰の詳しい説明

Chrome ブラウザ環境での実行を見てみましょう:

再帰とは何ですか? JavaScriptの再帰の詳しい説明



#3. 再帰##最初に単純なものを見てみましょう。 JavaScript 再帰

function sumRange(num) {
  if (num === 1) return 1;
  return num + sumRange(num - 1)
}

sumRange(3) // 6

上記のコード実行シーケンス:

1. 関数 sumRange(3) が実行され、sumRange(3) がスタックにプッシュされ、return キーワードが検出されますが、 SumRange(num - 1) の呼び出しは sumRange(2)

2 であるため、スタックからすぐに取り出すことはできません。したがって、sumRange(2) はスタックにプッシュされ、以下同様に sumRange(1) がプッシュされます。最後に、sumRange(1) はスタックをポップして 1 を返し、sumRange(2) はスタックをポップして 2 を返し、sumRange(3) はスタックをポップします

4、つまり 3 2 1 の結果は 6

フローチャートを見てください

再帰とは何ですか? JavaScriptの再帰の詳しい説明つまり、再帰これは、スタックをプッシュおよびポップするプロセスでもあります。

再帰は非再帰として表現できます。以下は、上記の再帰の例と同等の実行です。

// for 循环
function multiple(num) {
    let total = 1;
    for (let i = num; i > 1; i--) {
        total *= i
    }
    return total
}
multiple(3)

4 再帰に関する注意事項。

上記の場合、次のように例を変更します。

function multiple(num) {
    if (num === 1) console.log(1)
    return num * multiple(num - 1)
}

multiple(3) // Error: Maximum call stack size exceeded

上記のコードの最初の行に return キーワード文がないため、再帰の終了条件がないため、常にプッシュされます。スタックが発生し、メモリ リークが発生します。

再帰が起こりやすいエラー ポイント

終了ポイントが設定されていません

    再帰を除き、その他パーツ コード
  1. #再帰が適切な場合は、
  2. # さて、上記は JavaScript における再帰の概念です。
  3. 以下は練習問題です。

6. 練習問題

1. 文字列を受け入れて文字列を返す関数を作成します。この文字列は元の文字列を反転したものです。

2. 文字列を受け取り、前から後ろまで 1 文字を比較する関数を作成します。2 つの文字が等しい場合は true を返し、等しくない場合は false を返します。 3. 配列を受け取り、フラット化された新しい配列を返す関数を作成します。

4. オブジェクトの値が偶数の場合、それらを加算して合計値を返す関数を作成します。

5. オブジェクトを受け取り、配列を返す関数を作成します。この配列には、オブジェクト内の文字列であるすべての値が含まれます。

7.

参考1

function reverse(str) {
   if(str.length 参考2<p></p><pre class="brush:php;toolbar:false">function isPalindrome(str){ 
    if(str.length === 1) return true;
    if(str.length === 2) return str[0] === str[1]; 
    if(str[0] === str.slice(-1)) return isPalindrome(str.slice(1,-1)) 
    return false; 
}
var str = 'abba'
isPalindrome(str)
参考3
function flatten (oldArr) {
   var newArr = [] 
   for(var i = 0; i 参考4<p></p><pre class="brush:php;toolbar:false">function nestedEvenSum(obj, sum=0) {
    for (var key in obj) { 
        if (typeof obj[key] === 'object'){ 
            sum += nestedEvenSum(obj[key]); 
        } else if (typeof obj[key] === 'number' && obj[key] % 2 === 0){ 
            sum += obj[key]; 
        }
     } 
     return sum;
}
nestedEvenSum({c: 4,d: {a: 2, b:3}})
参考5

function collectStrings(obj) {
    let newArr = []
    for (let key in obj) {
        if (typeof obj[key] === 'string') {
            newArr.push(obj[key])
        } else if(typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
           newArr = newArr.concat(collectStrings(obj[key]))
        }
    }
    return newArr
}
var obj = {
        a: '1',
        b: {
            c: 2,
            d: 'dd'
        }
    }
collectStrings(obj)

5 。 まとめ######

再帰の本質は、再帰部分を検討するときに、多くの場合、最初に通常の部分について考える必要があるということです。JavaScript 再帰でよく使用されるメソッドは次のとおりです。

配列: スライス、連結

String : スライス、substr、substring

オブジェクト: Object.assign

以上が再帰とは何ですか? JavaScriptの再帰の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。