इस कोड को समाप्त करने का क्या मौका है?


10

मैंने इस पायथन कोड को लिखा, और आश्चर्य किया कि क्या यह कभी-कभी समाप्त नहीं होता है (यह मानते हुए कि हमारे पास अनंत स्मृति / समय था और कोई पुनरावृत्ति गहराई सीमा नहीं है)।

सहज रूप से आपको लगता है कि यह समाप्त हो जाएगा, क्योंकि कुछ बिंदु पर आपको भाग्यशाली होना चाहिए , और अगर यह समाप्त नहीं होता है तो आपके पास भाग्यशाली होने के लिए अनंत समय है। दूसरी ओर, जैसे-जैसे पुनरावृत्ति की गहराई बढ़ती जाती है, आपको तेजी से और अधिक भाग्यशाली बनना चाहिए।

import random

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

यदि random_treeहमेशा समाप्त नहीं होता है, तो क्यों, और क्या मौका है कि यह समाप्त होता है?

P=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

इसे ब्रांचिंग प्रक्रिया के रूप में जाना जाता है। इसका उत्तर खोजने के लिए इसे देखें।
युवल फिल्मस ६

जवाबों:


8

1.25>1


1

तो यह पता चला है। यह जड़ इस तथ्य को व्यक्त करती है कि यदि आप कभी भी शुरू नहीं करते हैं तो प्रक्रिया विलुप्त हो जाती है। मेरा सुझाव है कि आप इस शास्त्रीय विषय पर कुछ पठन करें, जिसका उदाहरण फेलर द्वारा दिया गया है।
युवल फिल्मस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.