このコードが終了する可能性は何ですか?


10

私はこの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 1P=1(10.5)(1(P+P2+P3+P4+P5)/5)0.6841241

おそらくもっと複雑ですが、興味深いのは、次の場合の終了確率 です。P(a,b)

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

1
@DavidRicherbyを下部に追加しました。一番上のコードは単純random_tree(0.5, 5)です。
orlp 2016年

これは分岐プロセスと呼ばれます。調べて答えを見つけてください。
Yuval Filmus

回答:


8

これは分岐プロセスの例です。分岐プロセスの動作は、予想される子の数に依存します。これは、あなたのケースではです。この数が最大で1の場合、プロセスは確率1で絶滅します。数が1より大きい場合、プロセスは永久に存続する可能性があります。絶滅確率は計算したものに過ぎません。1より小さいルートを選択する必要があります。1.25>1


のルートが無効なのはなぜですか?1
orlp 2016年

だから結局のところ。この根は、あなたが始めなければプロセスが絶滅するという事実を表現しています。この古典的なトピックについて少し読んでみてください。たとえば、Fellerによって扱われます。
Yuval Filmus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.