反復を使用して Java 関数の再帰呼び出しを置き換える
Java では、再帰はさまざまな問題を解決するために使用される強力なツールです。ただし、場合によっては、反復を使用する方が効率が高く、スタック オーバーフローが発生しにくいため、より良いオプションになる場合があります。
反復の利点は次のとおりです。
- 再帰呼び出しごとに新しいスタック フレームを作成する必要がないため、より効率的です。
- スタックスペースの使用量が限られているため、スタックオーバーフローは発生しにくいです。
再帰呼び出しではなく反復メソッド:
Java には、再帰関数を反復関数に変換する方法がいくつかあります。
1. スタックの使用
スタックの使用は、再帰関数を反復関数に変換する最も簡単な方法です。スタックは、関数呼び出しスタックに似た、後入れ先出し (LIFO) データ構造です。
public int factorial(int n) { Stack<Integer> stack = new Stack<>(); stack.push(n); while (!stack.isEmpty()) { int curr = stack.pop(); if (curr == 1) { return 1; } stack.push(curr - 1); stack.push(curr); } }
2. キューの使用
キューを使用して、再帰関数を反復関数に変換することもできます。キューは、メッセージ キューに似た先入れ先出し (FIFO) データ構造です。
public int factorial(int n) { Queue<Integer> queue = new LinkedList<>(); queue.offer(n); while (!queue.isEmpty()) { int curr = queue.poll(); if (curr == 1) { return 1; } queue.offer(curr - 1); queue.offer(curr); } }
3. 関数呼び出しスタックを手動でシミュレートする
関数呼び出しスタックを手動でシミュレートして反復を実現することもできます。これには、スタック フレームの配列を明示的に維持し、配列インデックスを介して現在のスタック フレームを追跡することが含まれます。
public int factorial(int n) { int[] stack = new int[100]; int top = -1; stack[++top] = 1; stack[++top] = n; while (top > 0) { int curr = stack[top--]; if (curr == 1) { return stack[top--]; } stack[++top] = curr - 1; stack[++top] = curr; } }
実践的なケース: フィボナッチ数列
再帰の代わりに反復を使用する方法を説明するために、フィボナッチ数列を例に挙げてみましょう。
// 递归 public int fib(int n) { if (n <= 1) { return n; } return fib(n - 1) + fib(n - 2); } // 迭代(使用队列) public int fib(int n) { Queue<Integer> queue = new LinkedList<>(); queue.offer(0); queue.offer(1); while (n-- > 1) { int a = queue.poll(); int b = queue.poll(); queue.offer(a + b); } return queue.poll(); }
反復を使用することで、再帰呼び出しのオーバーヘッドを回避し、効率を向上させます。
以上がJava 関数での再帰呼び出しの代替手段は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

この記事では、Javaプロジェクト管理、自動化の構築、依存関係の解像度にMavenとGradleを使用して、アプローチと最適化戦略を比較して説明します。

この記事では、MavenやGradleなどのツールを使用して、適切なバージョン化と依存関係管理を使用して、カスタムJavaライブラリ(JARファイル)の作成と使用について説明します。

この記事では、カフェインとグアバキャッシュを使用してJavaでマルチレベルキャッシュを実装してアプリケーションのパフォーマンスを向上させています。セットアップ、統合、パフォーマンスの利点をカバーし、構成と立ち退きポリシー管理Best Pra

この記事では、キャッシュや怠zyなロードなどの高度な機能を備えたオブジェクトリレーショナルマッピングにJPAを使用することについて説明します。潜在的な落とし穴を強調しながら、パフォーマンスを最適化するためのセットアップ、エンティティマッピング、およびベストプラクティスをカバーしています。[159文字]

Javaのクラスロードには、ブートストラップ、拡張機能、およびアプリケーションクラスローダーを備えた階層システムを使用して、クラスの読み込み、リンク、および初期化が含まれます。親の委任モデルは、コアクラスが最初にロードされ、カスタムクラスのLOAに影響を与えることを保証します


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 中国語版
中国語版、とても使いやすい

Dreamweaver Mac版
ビジュアル Web 開発ツール

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
