Ich habe diesen Python-Code geschrieben und mich gefragt, ob er manchmal einfach nicht endet (vorausgesetzt, wir hatten unendlich viel Speicher / Zeit und keine Rekursionstiefenbegrenzung).
Intuitiv würden Sie denken, dass es endet, da Sie irgendwann Glück haben müssen , und wenn es nicht endet, haben Sie unendlich viel Zeit, um Glück zu haben. Andererseits müssen Sie mit zunehmender Rekursionstiefe exponentiell mehr Glück haben.
import random
def random_tree():
if random.random() < 0.5:
return 0
return [random_tree() for _ in range(random.randint(1, 5))]
Wenn random_tree
nicht immer beendet wird, warum und wie hoch ist die Wahrscheinlichkeit, dass es beendet wird?
Ich habe versucht, es mit zu berechnen , was in seiner schrecklichen Nutzlosigkeit entweder ergibt die Antwort ~ oder ... .
Wahrscheinlich komplizierter, aber auch faszinierend für mich, was ist die Kündigungsmöglichkeit für:
def random_tree(a, b):
if random.random() < a:
return 0
return [random_tree(a, b) for _ in range(random.randint(1, b))]
Oder im Pseudocode:
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
random_tree(0.5, 5)
.Antworten:
Dies ist ein Beispiel für einen Verzweigungsprozess . Das Verhalten eines Verzweigungsprozesses hängt von der erwarteten Anzahl von Kindern ab, die in Ihrem Fall beträgt . Wenn diese Zahl höchstens 1 ist, erlischt der Prozess mit Wahrscheinlichkeit 1. Wenn die Zahl größer als 1 ist, hat er eine Chance, für immer zu überleben. Die Extinktionswahrscheinlichkeit ist genau das, was Sie berechnet haben - Sie müssen die Wurzel auswählen, die kleiner als 1 ist.1.25>1
quelle