Ho scritto questo codice Python e mi chiedevo se a volte semplicemente non terminasse (supponendo che avessimo memoria / tempo infiniti e nessun limite di profondità di ricorsione).
Intuitivamente penseresti che finisca, dal momento che a un certo punto devi essere fortunato , e se non termina hai un infinito lasso di tempo per essere fortunato. D'altra parte, all'aumentare della profondità della ricorsione, devi diventare esponenzialmente più fortunato.
import random
def random_tree():
if random.random() < 0.5:
return 0
return [random_tree() for _ in range(random.randint(1, 5))]
Se random_tree
non termina sempre, perché e qual è la possibilità che si interrompa?
Ho provato a calcolarlo usando , che nella sua formidabile inutilità dà la risposta ~ 0.684124 oppure ... 1 .
Probabilmente più complicato, ma anche intrigante per me, qual è la possibilità di terminazione per:
def random_tree(a, b):
if random.random() < a:
return 0
return [random_tree(a, b) for _ in range(random.randint(1, b))]
O in pseudo-codice:
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)
.