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−(1−0.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.