โอกาสที่รหัสนี้จะถูกยกเลิกเป็นอย่างไร


10

ฉันเขียนรหัส Python นี้และสงสัยว่าบางครั้งมันก็ไม่ยุติ (สมมติว่าเรามีหน่วยความจำ / เวลาที่ไม่มีที่สิ้นสุดและไม่จำกัดความลึกของการเรียกซ้ำ)

คุณคิดว่ามันจะยุติโดยสังหรณ์ใจเนื่องจากในบางจุดคุณจะต้องโชคดีและถ้ามันไม่ยุติคุณมีเวลาไม่ จำกัด ที่จะได้รับโชคดี ในขณะที่ความลึกของการเรียกซ้ำเพิ่มขึ้นคุณจะต้องกลายเป็นผู้โชคดีมากขึ้น

import random

def random_tree():
    if random.random() < 0.5:
        return 0
    return [random_tree() for _ in range(random.randint(1, 5))]

หากrandom_treeไม่ยุติเสมอไปทำไมและโอกาสที่จะยุตินั้นมีอะไรบ้าง

ฉันพยายามคำนวณโดยใช้ซึ่งในนั้นมันไร้ประโยชน์ที่ยอดเยี่ยมอย่างใดอย่างหนึ่งให้คำตอบ ~ 0.684124หรือ ... 1P=1(10.5)(1(P+P2+P3+P4+P5)/5)0.6841241

อาจมีความซับซ้อนมากขึ้น แต่ก็น่าสนใจสำหรับฉันโอกาสในการเลิกจ้าง สำหรับ: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))]

หรือในรหัสหลอก:

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 เพิ่มที่ด้านล่าง random_tree(0.5, 5)รหัสที่ด้านบนเป็นเพียง
orlp

สิ่งนี้เรียกว่ากระบวนการแยกสาขา เงยหน้าขึ้นมองหาคำตอบ
Yuval Filmus

คำตอบ:


8

1.25>1


1

ดังนั้นมันจะเปิดออก รากนี้เป็นการแสดงออกถึงความจริงที่ว่าถ้าคุณไม่เคยเริ่มต้นแล้วกระบวนการจะสูญพันธุ์ ฉันขอแนะนำให้คุณอ่านบางเรื่องในหัวข้อคลาสสิคนี้ซึ่ง Feller ปฏิบัติเช่น
Yuval Filmus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.