2016-02-21 4 views
10

मान लिया जाये कि कंप्यूटर इस कार्यक्रम चल रहा है स्मृति की एक अनंत राशि है कि, मैं जहां अजगर जब चल निम्नलिखित टूट जाएगा में दिलचस्पी रखता हूँ:क्या तकनीकी सीमाएं पाइथन में ग्राहम के नंबर की गणना को रोकती हैं?

मस्ती के लिए, मैं मॉड्यूल hyperop के रूप में अजगर में hyperoperators कार्यान्वित किया। मेरी उदाहरणों में से एक ग्राहम संख्या है:

def GrahamsNumber(): 
    # This may take awhile... 
    g = 4 
    for n in range(1,64+1): 
     g = hyperop(g+2)(3,3) 
    return g 

वर्ग hyperop का संक्षिप्त संस्करण इस तरह दिखता है:

def __init__(self, n): 
    self.n = n 
    self.lower = hyperop(n - 1) 

def _repeat(self, a, b): 
    if self.n == 1: 
     yield a 

    i = 1 
    while True: 
     yield a 
     if i == b: 
      break 
     i += 1 

def __call__(self, a, b): 
    return reduce(lambda x, y: self.lower(y, x), self._repeat(a, b)) 

अनिवार्य रूप से पुस्तकालय, बस एक पुनरावर्ती गुना-सही ऑपरेशन है के लिए एक विशेष परिभाषा के साथ base case of n=1

return reduce(lambda x, y: self.lower(y, x), [a,]*b) 

हालांकि, it turns out that you can't make a list with more elements than the size of a C long: मूलतः __call__ खूबसूरती से के रूप में golfed किया गया था। यह एक मजेदार सीमा थी कि अधिकांश पायथन प्रोग्रामर शायद अपने सामान्य दिन-प्रतिदिन सामना नहीं करते हैं और यह निम्नलिखित प्रश्न को प्रेरित करता है।

कहाँ, अगर सब पर, hyperop गणना अजगर (विशेष रूप से 2.7.10) के एक तकनीकी सीमा के कारण असफल हो जायेगी?

+5

के रूप में * * "नमूदार ब्रह्मांड अभी तक बहुत ग्राहम संख्या का एक साधारण डिजिटल प्रतिनिधित्व शामिल करने के लिए छोटा है", मुझे पता नहीं कहने के लिए जा रहा हूँ। शीर्ष युक्ति: यदि आपको * "यह एक वैध प्रश्न है" से शुरू करना है * आप शायद गलत हैं! – jonrsharpe

+0

'yield' और" अनंत दृश्यों ", या कुछ और के उपयोग कि और अधिक संक्षेप नीचे पिन किए जा सकते के बारे में सवाल है? – user2864740

+0

सी लम्बाई के आकार की तुलना में अधिक तत्वों की सीमा केवल पायथन 2 के लिए उल्लिखित है .... – PascalVKooten

उत्तर

1

hyperop का हो सकता है कि मूल संस्करण मजबूत है और कुछ गूढ़ कारण के कारण विफल रहता बल्कि इसलिए hyperop निर्माता खुद कहता है और यह "अधिकतम प्रत्यावर्तन गहराई से अधिक हो गई" के साथ RuntimeError को जन्म देती है इस सटीक कोड में विफल रहता है (पुनरावर्ती कॉल की sys.setrecursionlimit के बाद - जो डिफ़ॉल्ट रूप से 2.7.10 में 1000 है)।

संबंधित मुद्दे