30,000 スタック フレームはかなり大きな数であるため、例外が発生します :-)
より慎重な方法で再帰を使用して解決します。再帰的に解決される理想的な問題は、「検索スペース」をすばやく削減する問題です(a)。
たとえば、再帰するたびに検索スペースが半分になる二分木トラバーサル:
def find (searchkey, node):
if node = NULL:
return NULL
if searchkey = node.key:
return node
if searchkey < node.key:
return find (searchkey, node.left)
return find (searchkey, node.right)
2 つの符号なし整数 (および上記の独自のアルゴリズム) を追加することは、結果が計算されるずっと前にスタック割り当てを吹き飛ばしてしまうため、再帰には適していません。
def add (a, b):
if a = 0:
return b
return add (a-1, b+1)
(a)検索空間は、考えられる答えのセット全体として定義できます。できるだけ早く減らしたい。
余談ですが、再帰の理想的な問題は、理論的/数学的な意味でスタックスペースとは何の関係もありません。それらは、次のように表現できる問題です。
- 「より単純な」引数を使用した同じまたは類似の問題。
- 「最も単純な」引数を持つ終了条件。
(この意味での「シンプル」は、終了条件に近づくことを意味します)。
理論的/数学的アプローチでは、スタック スペースを考慮する必要はありませんが、コンピューター サイエンティストとして考慮する必要があります。現実は限界を設定します:-)
再帰を使用しない場合も参照してください。再帰を反復に変換する状況。