2016-03-17 4 views
6

में रिकर्सन सीमा बढ़ाएं मेरे पास एक ऐसा फ़ंक्शन है जिसे इसे रिकर्सिवली कहा जाता है। जब मैं इसे चलाता हूं तो मुझे त्रुटि मिलती है "पाइथन ऑब्जेक्ट को कॉल करते समय अधिकतम रिकर्सन गहराई पार हो जाती है"पायथन - मैक ओएसएक्स

मैक पर सीमा कैसे बढ़ा सकती है? अगर मैं निम्नलिखित का उपयोग करें, मैं त्रुटि "मैक पर सीमा को बढ़ाने नहीं कर सकते"

resource.setrlimit(resource.RLIMIT_STACK, (2**24,-1)) 
sys.setrecursionlimit(10**6) 
+0

यह एक [पायथन सीमा] (http://stackoverflow.com/a/6809586/3872894) हो सकता है, मैक के साथ कुछ नहीं करना। –

+0

क्या आपने रैखिक स्टैक विकास की बजाय लॉग स्टैक वृद्धि के लिए अपने रिकर्सन को फिर से लिखने की संभावना पर विचार किया है? उदाहरण के लिए, अधिकतम सूची को अधिकतम सूची की तुलना में अधिकतम सूची की तुलना करके रिक्त रूप से स्थापित किया जा सकता है, लेकिन स्टैक सूची के आकार में रैखिक रूप से बढ़ेगा। एक बेहतर समाधान सूची के पहले भाग के अधिकतम भाग और सूची के दूसरे भाग को अधिकतम करना है, और उन दोनों में से बड़ा लेना, जो कम काम नहीं करता है लेकिन सूची के आकार में लॉकथिदमिक रूप से स्टैक बढ़ाता है । शायद आपकी समस्या को समान रूप से दोहराया जा सकता है। – pjs

+1

दिलचस्प @pjs, क्या आपके पास इसका मौका है? – Goodies

उत्तर

0

मैं एक समस्या है जहाँ मैं बार के कई अरबों आवर्ती की संभावना रही थी मिलता है, और जिस तरह से मैंने किया था पुनरावृत्ति द्वारा flattening द्वारा। मुझे नहीं पता कि इस विधि को पहले दस्तावेज किया गया है, क्योंकि मैं इसे खोजने के बजाय अपने साथ आया था। आपको बस इतना करना है कि प्रत्येक फंक्शन के स्थानीय नामस्थान को सूची में रखा जाए। यदि कोई वर्कअराउंड नहीं है, तो इसके लिए आपके वास्तविक कोड में बदलाव की आवश्यकता होगी। यहाँ यह कैसे काम करता है:

def flatten_a_list(obj):#[[6,5],7,[3,[9,0]]] -> [6,5,7,3,9,0] 
    flattened = [] 
    for item in obj: 
     if type(item) == list: 
      flattened.append(flatten_a_list(item)) 
     else: 
      flattened.append(item) 
    return flattened 

अब, यह पारंपरिक रूप से पुनरावर्ती है:

मैं इस कार्य हो कहो। इसे बनाने के लिए इतना है कि यह हालांकि कई nestings वहाँ कोई सीमा नहीं साथ कर रहे हैं के लिए काम करेंगे, मैं इस करना होगा:

from copy import deepcopy 

def improved(obj):#[[6,5],7,[3,[9,0]]] -> [6,5,7,3,9,0] 
    flattened = [] 
    position = [0] 
    while True: 
     print('position: {}'.format(str(position))) 
     x = deepcopy(obj) 
     try: 
      for index in position: 
       x = x[index] 
     except (IndexError, TypeError): 
      break 

     if type(x) == list: 
      position.append(0) 
      print('continuing') 
      continue 
     else: 
      flattened.append(x) 

     #Test the next position 
     test = deepcopy(position) 
     test[-1] += 1 
     x = deepcopy(test) 
     print('x: {}'.format(x)) 
     try: 
      y = deepcopy(obj) 
      for index in x: 
       y = y[index] 
      position = deepcopy(test) 
     except (IndexError, TypeError): 
      position = position[:-1] 
      try: 
       position[-1] += 1 
      except IndexError: 
       break 

    return flattened 

दो शब्द: मन झुकने

समारोह मैं काम करता है ठीक लिखा था, लेकिन यह unoptimized है। यदि आप गति चाहते हैं, तो पहले सुनिश्चित करें कि आप फ़ंक्शन को समझते हैं, फिर कोड के 'एक्स' और 'वाई' ब्लॉक ले कर इंडेक्स ओवरफ्लो की जांच को गठबंधन करते हैं।

आपको इसे अपने कोड में अनुकूलित करना होगा, लेकिन जब तक आप इसे समझते हैं, यह बहुत अधिक या समस्या नहीं होनी चाहिए। इसके अलावा, जवाब पार मंच और असीमित है।

+1

कृपया किसी भी डाउनवोट को समझाने के लिए स्वतंत्र महसूस करें –