20

どうやら、Python にテール コールの最適化が必要かどうかについて大騒ぎになっているようです。これは、誰かが Guido に SICP のコピーを送ったときに頭に浮かびました。私はグイドと同じ船に乗っています。テールコール最適化の概念を理解しています。Python が本当にそれを必要とする理由が思いつきません。

これを理解しやすくするために、TCO を使用して大幅に簡素化できるコードのスニペットを教えてもらえますか?

4

4 に答える 4

15

個人的には、テール コールの最適化に大きな価値を置いています。しかし、主な理由は、再帰を反復と同じくらい効率的にする (または反復を再帰のサブセットにする) ためです。ミニマル言語では、パフォーマンスを犠牲にすることなく、巨大な表現力を得ることができます。

「実用的な」言語 (Python など) である OTOH では、通常、想像できるほとんどすべての状況に対して他の多くの構造が存在するため、それほど重要ではありません。もちろん、不測の事態に備えて、持っていることは常に良いことです。

個人的には、テール コールの最適化に大きな価値を置いています。しかし、主な理由は、再帰を反復と同じくらい効率的にする (または反復を再帰のサブセットにする) ためです。ミニマル言語では、パフォーマンスを犠牲にすることなく、巨大な表現力を得ることができます。

「実用的な」言語 (Python など) である OTOH では、通常、想像できるほとんどすべての状況に対して他の多くの構造が存在するため、それほど重要ではありません。もちろん、不測の事態に備えて、持っていることは常に良いことです。

于 2009-05-20T22:19:21.487 に答える
6

代わりにループとして表現される可能性のあるものに再帰を強く使用したい場合は、「末尾呼び出しの最適化」が本当に必須です。しかし、Python の Benevolent Dictator For Life (BDFL) である Guido は、ループがループとして表現されることを強く信じています。

于 2009-05-21T04:46:01.060 に答える
5

末尾呼び出しの最適化により、スタック オーバーフローを心配することなく、再帰関数を簡単に記述できます。

def fac(n, result=1):
        if n > 1:
                return fac(n - 1, n * result)
        return result

末尾呼び出しの最適化を行わないと、これを大きな数で呼び出すと、スタックがオーバーフローする可能性があります。

于 2009-05-20T22:02:50.257 に答える
1

Guido はフォローアップの投稿で、TCO により、相互に再帰的に呼び出しを行う関数のコレクションとしてステート マシンをよりクリーンに実装できることを認識しました。ただし、同じ投稿で、彼は TCO を使用しない、同等にクリーンな代替ソリューションを提案しています。

于 2012-11-20T07:52:20.607 に答える