我写了这个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)
。