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_tree
tidak selalu berakhir, mengapa, dan bagaimana kemungkinan ia berakhir?
Saya sudah mencoba menghitungnya menggunakan , yang dalam kegunaannya yang luar biasa memberikan jawabannya ~ atau ... .0.684124 1
Mungkin lebih rumit, tetapi juga menarik bagi saya, apa peluang pemutusan untuk:
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
random_tree(0.5, 5)
.