此代码终止的机会是什么?


10

我写了这个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或... 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

这称为分支过程。查找它以找到答案。
Yuval Filmus

Answers:


8

1.25>1


1

事实证明。此根表示以下事实:如果您从不启动,则该过程将消失。我建议您对这个经典主题进行一些阅读,例如Feller对它进行了处理。
Yuval Filmus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.