2014-10-08 65 views
1

我很難理解此代碼的模式。我測試了這個函數,並且我知道輸入Ack(3,2)這個函數的循環次數是541次,所以它必須有一個解決這個問題的模式。請幫我找到模式。找出遞歸函數的模式

public static int Ack(int m,int n) 
{ 
    if (n < 0 || m < 0) return 0; 
    else if (m == 0) return n + 1; 
    else if (n == 0) return Ack(m - 1, 1); 
    else return Ack(m-1,Ack(m,n-1)); 
} 
+1

你尋求幫助重新建立一個非遞歸功能? – 2014-10-08 19:28:53

+2

多數民衆贊成在ackerman函數 - 增長真的非常快,它的反轉有助於分析聯合查找數據結構的漸近線。你可以得到封閉的公式@wiki(它使用Knuth箭頭符號)http://en.wikipedia.org/wiki/Ackermann_function – fex 2014-10-08 19:29:49

+0

不,我想知道這個代碼的模式所以我可以解決這個問題,而不寫這個代碼並運行它 – 2014-10-08 19:30:31

回答

0

下面是一些非遞歸Python代碼,計算同樣的事情(請注意,它需要一個類棧的數據結構):

def ack(m,n): 
    if n < 0 or m < 0: 
     return 0 

    next_m = [] 
    while m != 0 or (m==0 and next_m!=[]): 
     if (m==0 and next_m!=[]): 
      m = next_m.pop() 
      n = n+1 
      continue 
     if n==0: 
      m = m-1 
      n = 1 
     else: 
      n = n-1 
      next_m.append(m-1) 

    return n+1