Apa peluang kode ini berakhir?


10

Saya menulis kode Python ini, dan bertanya-tanya apakah kadang-kadang tidak berakhir (dengan asumsi kami memiliki memori / waktu tak terbatas dan tidak ada batas kedalaman rekursi).

Secara intuitif Anda akan berpikir itu berakhir, karena pada titik tertentu Anda harus beruntung , dan jika tidak berakhir, Anda memiliki waktu tak terbatas untuk beruntung. Di sisi lain, ketika kedalaman rekursi meningkat, Anda harus menjadi lebih beruntung secara eksponensial.

import random

def random_tree():
    if random.random() < 0.5:
        return 0
    return [random_tree() for _ in range(random.randint(1, 5))]

Jika random_treetidak selalu berakhir, mengapa, dan bagaimana kemungkinan ia berakhir?

Saya sudah mencoba menghitungnya menggunakan , yang dalam kegunaannya yang luar biasa memberikan jawabannya ~ atau ... .0.684124 1P=1(10.5)(1(P+P2+P3+P4+P5)/5)0.6841241

Mungkin lebih rumit, tetapi juga menarik bagi saya, apa peluang pemutusan untuk: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))]

Atau dalam pseudo-code:

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
@ DavidRicherbyDitambahkan di bagian bawah. Kode di atas adalah sederhana random_tree(0.5, 5).
orlp

Ini dikenal sebagai proses percabangan. Cari untuk menemukan jawabannya.
Yuval Filmus

Jawaban:


8

1.25>1


1

Jadi ternyata demikian. Root ini mengungkapkan fakta bahwa jika Anda tidak pernah memulai maka proses punah. Saya sarankan Anda membaca beberapa topik klasik ini, yang diperlakukan misalnya oleh Feller.
Yuval Filmus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.