이 코드가 종료 될 가능성은 얼마입니까?


10

나는이 파이썬 코드를 작성하고 때로는 단순히 끝나지 않는지 궁금했다 (무한 메모리 / 시간이 있고 재귀 깊이 제한이 없다고 가정).

직관적으로 당신은 어느 시점에서 운이 좋아야하기 때문에 그것이 종결된다고 생각할 것이며, 그것이 끝나지 않으면 운이 좋을 시간이 무한합니다. 반면에 재귀 깊이가 증가하면 기하 급수적으로 더 운이 좋아야합니다.

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 .P=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

답변:


8

1.25>1


1

그래서 밝혀졌습니다. 이 루트는 시작하지 않으면 프로세스가 사라진다는 사실을 나타냅니다. Feller 등이 다루는이 고전적인 주제에 대해 읽을 것을 권합니다.
Yuval Filmus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.