ホームページ > Java > &#&チュートリアル > 再帰: 概念、コンポーネント、および実際のアプリケーション — Java

再帰: 概念、コンポーネント、および実際のアプリケーション — Java

DDD
リリース: 2025-01-13 10:44:43
オリジナル
332 人が閲覧しました

Recursion: Concepts, Components, and Practical Applications — Java

この記事では、プログラミングにおける再帰の概念について説明します。ここでは、その主要な構成要素である基本ケースと再帰ケースについて説明します。 Java の例を使用して、再帰がどのように実装されるかを示し、無限ループやスタック オーバーフロー エラーを防ぐための安全策を強調しています。


コンピューター サイエンスでは、再帰の概念を理解することが不可欠です。再帰は、多くの場合、より複雑なアルゴリズムの基礎となるためです。また、プログラミングでは、再帰は、問題をより小さく管理しやすいサブ問題に分割することで問題を解決するために使用されるツールです。この投稿では、プログラミング言語 Java を使用して、再帰的メソッドのコンポーネント (基本ケースと再帰ケース) を検討します。

再帰メソッドの説明

再帰的なアルゴリズムまたはメソッドは、それ自体を呼び出し、問題をより小さく管理しやすい部分問題に分割することによって、複雑な問題を解決します。

再帰的メソッドを作成するための基本コンポーネントは、基本ケースと再帰的ケースです。

  • 基本ケースは、満たされた場合に再帰を停止する条件であり、通常は if ステートメント内で行われます。
  • 再帰ケースは、基本ケースの条件が満たされない場合に計算される一連のコード行または機能であり、常にその後に、通常は変更された入力を使用してそれ自体を呼び出す再帰メソッドが続きます。通常、コード行と再帰呼び出しは、基本条件が満たされているかどうかをチェックする「if」ステートメントに続く「else」ステートメント内にあります。ただし、「if」ステートメントに「return」ステートメントが含まれている場合、コード行と再帰呼び出しは「if」ステートメントの直後に見つかります。

変更されていない入力で自身を呼び出す再帰メソッド、または入力を受け取らない再帰メソッドは、基本ケースの条件が独立して変化する外部要因に基づいている場合に限り、無限再帰ループを作成しないことに注意してください。メソッドの入力の。

無限再帰メソッドの作成を避けるために、メソッドには最終的に到達する基本ケースを少なくとも 1 つ含める必要があります。再帰的メソッドには複数の基本ケースを含めることができることに注意してください。たとえば、再帰的メソッドには、特定の条件をチェックする基本ケースを含めることができ、その他のケースは安全装置として機能することができます。最初の基本条件に到達しない場合は、カウンターなどの保護手段により、利用可能なコンピューティング メモリに基づいて再帰の数が制限され、スタック オーバーフロー エラーが防止されます。

余談ですが、Python プログラミング言語には、プログラムが実行できる再帰の数を制限するメカニズムが組み込まれています。必要に応じて、Python システム (sys) ライブラリを使用して、この制限を変更したり、増減したりできます。

これは再帰メソッドの例です:

import java.util.Random;

public class AreWeThereYet {
    private static final Random randomGenerateMiles = new Random();

    public static void askAreWeThereYet(int totalMilesDriven, int tripTotalMiles) {

        // ---- Base case ---- We've arrived!
        if (totalMilesDriven >= tripTotalMiles) {
            System.out.println("We're here! Finally!");
            return;
        }

        // ---- Recursive case ----
        // Miles driven
        int milesDriven = randomGenerateMiles.nextInt(50) + 1; // Drive 1-50 miles

        // Keep asking and driving
        System.out.println("Are we there yet?");
        System.out.println("Not yet, we've traveled " + totalMilesDriven + "miles.");

        if (milesDriven + totalMilesDriven >= tripTotalMiles) {
            milesDriven = tripTotalMiles - totalMilesDriven;
        }

        System.out.println("--- Drives " + milesDriven + " miles ---");
        totalMilesDriven += milesDriven;

        // ---- Recursive call ----
        askAreWeThereYet(totalMilesDriven, tripTotalMiles);
    }

    public static void main(String[] args) {
        int tripTotalMiles = 100; // Total trip distance
        System.out.println("Trip total miles: " + tripTotalMiles);
        askAreWeThereYet(0, tripTotalMiles);
    }
}
ログイン後にコピー
ログイン後にコピー

出力

import java.util.Random;

public class AreWeThereYet {
    private static final Random randomGenerateMiles = new Random();

    public static void askAreWeThereYet(int totalMilesDriven, int tripTotalMiles) {

        // ---- Base case ---- We've arrived!
        if (totalMilesDriven >= tripTotalMiles) {
            System.out.println("We're here! Finally!");
            return;
        }

        // ---- Recursive case ----
        // Miles driven
        int milesDriven = randomGenerateMiles.nextInt(50) + 1; // Drive 1-50 miles

        // Keep asking and driving
        System.out.println("Are we there yet?");
        System.out.println("Not yet, we've traveled " + totalMilesDriven + "miles.");

        if (milesDriven + totalMilesDriven >= tripTotalMiles) {
            milesDriven = tripTotalMiles - totalMilesDriven;
        }

        System.out.println("--- Drives " + milesDriven + " miles ---");
        totalMilesDriven += milesDriven;

        // ---- Recursive call ----
        askAreWeThereYet(totalMilesDriven, tripTotalMiles);
    }

    public static void main(String[] args) {
        int tripTotalMiles = 100; // Total trip distance
        System.out.println("Trip total miles: " + tripTotalMiles);
        askAreWeThereYet(0, tripTotalMiles);
    }
}
ログイン後にコピー
ログイン後にコピー

要約すると、再帰は複雑な問題を解決するための洗練された強力なアプローチです。基本ケースと再帰ケースを定義することで、開発者は問題の複雑さを効果的に管理するアルゴリズムを作成できます。ただし、無限ループやスタック オーバーフロー エラーを防ぐために、再帰が適切に停止されるようにすることが重要です。提供されている Java の例「AreWeThereYet」は、これらの原則の動作を示しており、明確さと機能性を維持しながら再帰を動的に使用して問題を解決する方法を示しています。プログラミング手法の探求を続ける中、再帰は依然として貴重なスキルであり、思慮深い問題の分解とメソッド設計の重要性を強調します。


元々は、2024 年 11 月 8 日に Level UPcoding によって、Medium の Alex.omegapy で公開されました。

以上が再帰: 概念、コンポーネント、および実際のアプリケーション — Javaの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート