Який шанс припинення цього коду?


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 1П=1-(1-0,5)(1-(П+П2+П3+П4+П5)/5)0,6841241

Напевно, складніше, але і інтригує мене, що таке шанс припинення для:П(а,б)

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

Ось і виходить. Цей корінь виражає той факт, що якщо ви ніколи не починаєте, то процес вимер. Я пропоную вам прочитати цю класичну тему, яку, наприклад, розглядає Феллер.
Yuval Filmus
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.