Qual è la possibilità che questo codice termini?


10

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_treenon 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 .P=1(10.5)(1(P+P2+P3+P4+P5)/5)0.6841241

Probabilmente più complicato, ma anche intrigante per me, qual è la possibilità di terminazione per: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))]

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

1
@DavidRicherby Aggiunto in fondo. Il codice in alto è semplicemente random_tree(0.5, 5).
orlp

Questo è noto come processo di ramificazione. Cerca per trovare la risposta.
Yuval Filmus,

Risposte:


8

1.25>1


1

Quindi si scopre. Questa radice esprime il fatto che se non si avvia mai, il processo si estingue. Ti suggerisco di leggere un po 'su questo argomento classico, che è trattato ad esempio da Feller.
Yuval Filmus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.