私はこのPythonコードを書いて、それが時々単に終了しないのではないかと考えました(無限のメモリ/時間と再帰の深さの制限がないと仮定した場合)。
直感的には、ある時点でluckyを取得する必要があるため、終了すると思います。終了しない場合、ラッキーを取得するための時間は無限です。一方、再帰の深さが増すにつれて、あなたは指数関数的にもっと幸運になる必要があります。
import random
def random_tree():
if random.random() < 0.5:
return 0
return [random_tree() for _ in range(random.randint(1, 5))]
random_tree
常に終了するとは限らない場合、なぜ、そしてそれが終了する可能性は何ですか?
私はを使用してそれを計算しようとしましたが、これはどちらかが非常に役に立たないということです答えまたは...。0.684124 1
おそらくもっと複雑ですが、興味深いのは、次の場合の終了確率 です。
def random_tree(a, b):
if random.random() < a:
return 0
return [random_tree(a, b) for _ in range(random.randint(1, b))]
または疑似コードで:
random_tree(a, b) is a function that either:
- returns 0 with probability a
- returns a list containing the results of 1 to b
(uniformly chosen from this inclusive range) recursive calls
random_tree(a, b):
if rand() < a # rand() is a random real on [0, 1)
return 0
list = []
len = randint(1, b) # uniform random integer from 1 to b inclusive
do len times
append random_tree(a, b) to list
return list
これは分岐プロセスと呼ばれます。調べて答えを見つけてください。
—
Yuval Filmus
random_tree(0.5, 5)
です。