Я написав цей код 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
не завжди припиняється, чому, і який шанс, що він припиняється?
Я спробував обчислити його, використовуючи , що в своїй надзвичайній непотрібності або дає відповідь ~ або ... .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)
.