2010-10-24 15 views
5

मैं गणना पर एक पुस्तक (मैन्सी 1 9 67) पर अपना काम कर रहा हूं और लूप के संदर्भ में परिभाषित एक फ़ंक्शन में रिकर्सिव फ़ंक्शन से संबंधित कठिन समय ले रहा हूं।एकरमेन फ़ंक्शन बनाम एन नेस्टेड लूप

एकरमैन समारोह (अजगर के सारे कोड):

def a(n,m): 
    if n==0: 
     return m+1 
    if m==0: 
     return a(n-1,1) 
    return a(n-1,a(n,m-1)) 

और एक समारोह है कि n नेस्टेड छोरों के साथ गणना करता है:

def p(n,m): 
    for i_1 in range(m): 
     for i_2 in range(m): 
      ... 
      for i_n in range(m): 
        m+=1 

एक विशेष रूप से वह दो कार्यों के बीच संबंधों को खोजने के लिए पूछता है इसे लिखने का एक पुनरावर्ती तरीका (एक लूप के साथ) है:

def p(n,m): 
    if n==0: 
     return m+1 
    for i in range(m): 
     m=p(n-1,m) 
    return m 

या पूरी तरह से रिकर्स लिखने के लिए ive तरीका यह होगा:

def p(n,m): 
    return P(n,m,m) 
def P(n,k,m): 
    if n==0: 
     return m+1 
    if k==1: 
     return P(n-1,m,m) 
    m=P(n,k-1,m) 
    return P(n-1,m,m) 

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

+0

पहले कोड स्निपेट में आपके पास लगातार दो 'वापसी' है - एक टाइपो? – eumiro

+0

@ यूमिरो, दूसरी वापसी वह मामला है जब एम! = 0 और एन! = 0 –

+0

@ पॉल, ठीक है, धन्यवाद, मैंने कोड इंडेंटिंग तय की है। – eumiro

उत्तर

1

उहम ... मुझे नहीं लगता कि इससे आपको बहुत मदद मिलेगी, मैं थोड़ी परेशान हूं, लेकिन यहां मेरे विचार हैं।

  • एकरमैन (0, मी) == पी (0, मी)
  • एकरमैन (1, मीटर + 1) == पी (1, मी)

संपादित करें - मैं इंतज़ार मुझे लगता है कि मैंने समारोह को मिस्पी किया है। मैं बाद में यह और विचार दूंगा, और अगर मैं कुछ सोचता हूं तो मैं अपडेट करूंगा!

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