#include<stdio.h>
long stack[1000000];
int ackermann(int m, int n);
int main()
{
int m, n;
while(scanf("%d%d", &m, &n) != EOF)
{
printf("%d", ackermann(m, n));
}
return 0;
}
int ackermann(int m, int n)
{
int top = 1;
stack[0] = m;
stack[1] = n;
while(top)
{
n = stack[top--];
m = stack[top];
if ( m == 0 )
{
stack[top] = n+1;
}
else if( m > 0 && n == 0)
{
stack[top++] = m - 1;
stack[top] = 1;
}
else if( m > 0 && n > 0)
{
stack[top++] = m - 1;
stack[top++] = m;
stack[top] = n-1;
}
}
return stack[0];
}
不過這種方法的效率也不高,當m=2,n太大時,或m=3時,執行時間也很長,將近10秒,甚至更長,直至棧溢出。
我們換用第三種方法,直接推到公式。
A(0, n) = n+1;
A(1, n) = A(0, A(1, n-1))
= A(1, n-1) + 1
= A(1, n-2) + 2
= n + 2;
A(2, n) = A(1, A(2, n-1))
= A(2, n-1) + 2
= A(2, n-2) + 2*2
= 2*n + 3;
A(3, n) = A(2, A(3, n-1))
= A(3, n-1)*2 +3
= 5*2^n + 3*2^(n-1) + … 3*2 + 3
= 經過拆項,合併
= 2^(n+3) – 3
經推導
A(4,1) = 65533
A(4,2) = A(3, A(4, 1)) = 2^(A(4, 1) + 3) – 3 = 2^65536 – 3
於是,在計算機能表示的數範圍內,我們可以用公式來求出Ackermann函式的值。
ackerman函式遞歸求解:
#include <iostream>
#include <cstdlib>
using namespace std;
long ackman(long m, long n);
int main(int argc, char *argv[])
{
long m,n;
cin>>m>>n;
cout<<ackman(m,n);
system("PAUSE");
return 0;
}
long ackman(long m, long n)
{
long stack[10000];
int pos=1;
stack[0]=m;stack[1]=n;
while(pos)
{
n=stack[pos--];
m=stack[pos];
if(m==0)
stack[pos]=n+1;
if(m!=0&&n==0)
{
stack[pos++]=m-1;
stack[pos]=1;
}
if(m!=0&&n!=0)
{
stack[pos++]=m-1;
stack[pos++]=m;
stack[pos]=n-1;
}
}
return stack[0];
}
相關詞條
-
Ackermann函式
阿克曼函式(Ackermann)是非原始遞歸函式的例子。它需要兩個自然數作為輸入值,輸出一個自然數。它的輸出值增長速度非常高,僅是對於(4,3)的輸出已...
-
阿克曼函式
阿克曼函式(Ackermann)是非原始遞歸函式的例子。它需要兩個自然數作為輸入值,輸出一個自然數。它的輸出值增長速度非常快,僅是對於(4,3)的輸出已...
歷史 定義 意義 反函式 計算代碼 -
《C語言範例開發大全》
結構綜合實例、數組。提高篇主要介紹了函式、指針、字元串、編譯預處理和變數... 實例029 stdlib庫的函式套用 42 實例030 math庫的函式套用 43 3.3 標準輸出和輸入函式 45 實例031 得到...
圖書信息 內容簡介 圖書目錄 創作背景 -
算法設計與分析與分析習題解答
習題3-14 Ackermann函式習題3-17 最短行駛路線習題3...1-4 函式的漸近表達式習題1-5 O(1)和O(2)的區別習題1-7... 函式漸進階習題1-11 n!的階習題1-12 平均情況下的計算時間複雜性...
內容提要 章節目錄 -
威廉·阿克曼
主要作品1928年他跟大衛·希爾伯特合寫《理論邏輯原理》(Grundzuge der Theoretischen Logik)。...
主要作品 人物生平 -
生成樹算法
為O(|E|α(V)),其中α為Ackermann函式,其增長非常慢...
自由樹 生成樹 分類 最小生成樹 套用