ฉันเขียนรหัส 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หรือ ... 1
อาจมีความซับซ้อนมากขึ้น แต่ก็น่าสนใจสำหรับฉันโอกาสในการเลิกจ้าง สำหรับ:
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
สิ่งนี้เรียกว่ากระบวนการแยกสาขา เงยหน้าขึ้นมองหาคำตอบ
—
Yuval Filmus
random_tree(0.5, 5)
รหัสที่ด้านบนเป็นเพียง