阿克曼函式的計算

2021-10-13 08:53:52 字數 1194 閱讀 5107

上圖為阿克曼函式的定義,根據函式解析式,我們可以很容易的寫出遞迴式

def

akm(m, n)

:if m ==0:

return n +

1elif m >

0and n ==0:

return akm(m-1,

1)elif m >

0and n >0:

return akm(m -

1, akm(m, n -1)

)

m, n =

map(

int,

input()

.split(

))

對於比較小的n值,m=1或2的情況,遞迴式是很好的,n值稍微大一些,我們也可以通過設定遞迴深度的方法求出答案

sys.setrecursionlimit(

10000000

)

但是,如果對於n值很大,或者m達到3,再去求解,遞迴深度就會大到我們無法忍受,這個時候,我們只能按照數學方法去求解這個問題

這個時候顯然有akm(0,n) = n+1

此時我們求解物件是akm(1,n),n=0時,根據函式,有akm(1,0)=akm(0,1)=2;如果n!=0,那麼akm(1,n)=akm(0,akm(1,n-1)),注意此時我們可以帶入函式得到akm(1,n)=akm(1,n-1)+1

這樣我們就得到了後一項與前一項的遞推關係,所以m=1這種情況阿克曼函式構成以2為首項,1為公差的等差數列,注意數列從0開始。這樣我們求此數列的通項公式,可以得到akm(1,n)=n+2

此時我們的求解物件是akm(2,n),n=0時,根據函式,利用m=1的結論,有akm(2,0)=akm(1,1)=3,當n!=0時,利用m=1的結論,有akm(2,n)=akm(1,akm(2,n-1))=akm(2,n-1)+2,這樣又構成了乙個等差數列,同樣求得akm(2,n)=2*n+3

此時我們的求解物件是akm(3,n),n=0時,根據函式,利用m=2的結論,有akm(3,0)=akm(2,1)=5,當n!=0時,利用m=1的結論,有akm(3,n)=akm(1,akm(3,n-1))=2akm(3,n-1)+3,求這個通項,利用高中的等比數列知識我們容易的想到可以兩邊同時加上3,得到akm(3,n)+3=2(akm(3,n-1)+3),這樣就構成了乙個等比數列,利用數列知識,求得akm(3,n)=2n+3-3

阿克曼函式

阿克曼函式可以遞迴地定義如下 現在艾迪給你兩個數字 m和n,你的任務是計算的價值 m,n 這是如此簡單的問題,如果你解決這個問題,你將收到乙個獎 艾迪將邀請你,6餐廳吃晚飯 輸入的每一行輸入兩個整數,即m,n,0 m 3。注意,當m 3,n可以是任意整數不到1000000,而m 3,n的值限制在24...

阿克曼函式推導過程(m 3)

阿克曼函式 ackermann 是非原始遞迴函式的例子。它需要兩個自然數作為輸入值,輸出乙個自然數。它的輸出值增長速度非常快,僅是對於 4,3 的輸出已大得不能準確計算。a m,n left end right.因為 m 很小,所以我們可以針對 0 leq m leq 3 來對阿克曼函式進行推導 對...

可持久化並查集(一) 從阿克曼函式到映象

noip2010 以下題目可以跳過。prison.pas c cpp 問題描述 s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值...