Tôi đã viết mã Python này và tự hỏi liệu đôi khi nó chỉ đơn giản là không chấm dứt (giả sử chúng ta có bộ nhớ / thời gian vô hạn và không có giới hạn độ sâu đệ quy).
Theo trực giác, bạn nghĩ rằng nó chấm dứt, vì đến một lúc nào đó bạn phải gặp may mắn và nếu nó không chấm dứt, bạn có một khoảng thời gian vô hạn để gặp may mắn. Mặt khác, khi độ sâu đệ quy tăng lên, bạn phải trở nên may mắn hơn theo cấp số nhân.
import random
def random_tree():
if random.random() < 0.5:
return 0
return [random_tree() for _ in range(random.randint(1, 5))]
Nếu random_tree
không luôn luôn chấm dứt, tại sao, và cơ hội mà nó chấm dứt là gì?
Tôi đã cố gắng tính toán nó bằng , trong đó vô dụng tuyệt vời hoặc đưa ra câu trả lời ~ 0,684124 hoặc ... 1 .
Có lẽ phức tạp hơn, nhưng cũng hấp dẫn với tôi, cơ hội chấm dứt gì:
def random_tree(a, b):
if random.random() < a:
return 0
return [random_tree(a, b) for _ in range(random.randint(1, b))]
Hoặc trong mã giả:
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
Điều này được gọi là một quá trình phân nhánh. Nhìn lên để tìm câu trả lời.
—
Yuval Filmus
random_tree(0.5, 5)
.