Я написал этот код на Python и подумал, а может ли он просто не завершиться (при условии, что у нас было бесконечное количество памяти / времени и нет предела глубины рекурсии).
Интуитивно вы думаете, что он заканчивается, поскольку в какой-то момент вам повезет , а если он не закончится, у вас будет бесконечное количество времени, чтобы стать удачливым. С другой стороны, с увеличением глубины рекурсии вы должны стать экспоненциально более удачливыми.
import random
def random_tree():
if random.random() < 0.5:
return 0
return [random_tree() for _ in range(random.randint(1, 5))]
Если random_tree
не всегда заканчивается, почему, и какова вероятность того, что он прекращается?
Я пытался вычислить это, используя , что в своей потрясающей бесполезности либо дает ответ ~ или ... .
Возможно, более сложный, но также и интригующий для меня, каков шанс завершения для:
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
random_tree(0.5, 5)
.Ответы:
Это пример ветвящегося процесса . Поведение ветвящегося процесса зависит от ожидаемого числа детей, которое в вашем случае составляет . Когда это число не превышает 1, процесс вымирает с вероятностью 1. Когда число превышает 1, у него есть шанс выжить навсегда; вероятность вымирания - это то, что вы рассчитали - вам нужно выбрать корень, который меньше 1.1.25>1
источник