Python で効率的な合計を行うために末尾呼び出し再帰を実装するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-21 12:11:31
オリジナル
832 人が閲覧しました

How to Implement Tail Call Recursion for Efficient Summation in Python?

Python の再帰: 理解するためのガイド

整数のリストを合計するための再帰関数

という再帰関数を作成する必要があるとします。リスト内のすべての整数の合計を計算する「listSum」。目標は、組み込み関数を使用せずにこれを行うことです。まず、関数の結果をそれ自体で表現する方法を考えます。

この場合、同じ関数を呼び出した結果に最初の数値を加算することで結果を取得できます。リスト内の残りの要素。再帰的に、これは次のように表現できます:

listSum([1, 3, 4, 5, 6]) = 1 + listSum([3, 4, 5, 6])
                         = 1 + (3 + listSum([4, 5, 6]))
                         = 1 + (3 + (4 + listSum([5, 6])))
                         = 1 + (3 + (4 + (5 + listSum([6]))))
                         = 1 + (3 + (4 + (5 + (6 + listSum([])))))
ログイン後にコピー

再帰の基本ケースは、リストが空になるとき、つまり結果 0 を必要とするイベントです。このアプローチを Python コードで実装します:

<code class="python">def listSum(ls):
    if not ls:
        return 0
    return ls[0] + listSum(ls[1:])</code>
ログイン後にコピー

末尾呼び出し再帰

以前の実装は、実際の結果を計算するために前の関数呼び出しの値に依存しています。これは、末尾呼び出し再帰を使用して改善できます。

<code class="python">def listSum(ls, result):
    if not ls:
        return result
    return listSum(ls[1:], result + ls[0])</code>
ログイン後にコピー

追加のパラメーター結果を導入することで、その中に合計が蓄積され、基本条件が満たされたときにそれが返されます。

Passing Around Index

複数の中間リストの作成を避けるために、処理対象の項目のインデックスを渡すことができます。

<code class="python">def listSum(ls, index, result):
    if index == len(ls):
        return result
    return listSum(ls, index + 1, result + ls[index])</code>
ログイン後にコピー

基本条件は、インデックスがリストの長さに達したかどうかをチェックします。

内部関数のバージョン

パラメータの受け渡しを簡略化するために、内部関数を使用できます。

<code class="python">def listSum(ls):
    def recursion(index, result):
        if index == len(ls):
            return result
        return recursion(index + 1, result + ls[index])
    return recursion(0, 0)</code>
ログイン後にコピー

内部関数の再帰はインデックスと結果のパラメータを受け取り、listSum が返します。初期値を使用して内部関数を呼び出した結果。

デフォルト パラメータのバージョン

デフォルト パラメータを使用すると、さらに簡素化されます。

<code class="python">def listSum(ls, index=0, result=0):
    if index == len(ls):
        return result
    return listSum(ls, index + 1, result + ls[index])</code>
ログイン後にコピー

デフォルト値はインデックスと

再帰累乗問題

累乗(基数, 指数)を計算する問題を考えてみましょう。これは、基数を指数で累乗した値を返します。再帰的に、解を定義できます:

power(2, 5) = 2 * power(2, 4)
            = 2 * (2 * power(2, 3))
            = 2 * (2 * (2 * power(2, 2)))
            = 2 * (2 * (2 * (2 * power(2, 1))))
ログイン後にコピー

基本条件は指数が 1 以下になるときです。この場合、結果は基本そのものになります:

            = 2 * (2 * (2 * (2 * 2)))
            = 2 * (2 * (2 * 4))
            = 2 * (2 * 8)
            = 2 * 16
            = 32
ログイン後にコピー

Python での実装:

<code class="python">def power(base, exponent):
    if exponent <= 1:
        return base
    return base * power(base, exponent - 1)</code>
ログイン後にコピー

テールコール最適化バージョンのデフォルトパラメータの使用:

<code class="python">def power(base, exponent, result=1):
    if exponent <= 0:
        return result
    return power(base, exponent - 1, result * base)</code>
ログイン後にコピー

以上がPython で効率的な合計を行うために末尾呼び出し再帰を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!