Cơ hội mà mã này chấm dứt là gì?


10

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

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ì: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))]

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

1
@DavidR Richby Đã thêm vào dưới cùng. Mã ở trên chỉ đơn giản là random_tree(0.5, 5).
orlp

Đ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

Câu trả lời:


8

1.25>1


1

Thế là hóa ra. Rễ này thể hiện một thực tế là nếu bạn không bao giờ bắt đầu thì quá trình bị tuyệt chủng. Tôi đề nghị bạn nên đọc một số chủ đề cổ điển này, được Feller đối xử.
Yuval Filmus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.