阿克曼函数
阿克曼函數
定義
阿克曼函數的定義如下:
Ack(m,n)={當m=0時返回n+1當n=0時返回Ack(m?1,1)當m,n>0時返回Ack(m?1,Ack(m,n?1))Ack(m,n)=\left\{ \begin{aligned} &當m=0時返回n+1\\ &當n=0時返回Ack(m-1,1)\\ &當m,n>0時返回Ack(m-1,Ack(m,n-1))\\ \end{aligned} \right. Ack(m,n)=???????當m=0時返回n+1當n=0時返回Ack(m?1,1)當m,n>0時返回Ack(m?1,Ack(m,n?1))?
規律
Ack(0,n)=n+1Ack(1,n)=Ack(0,Ack(1,n?1))=Ack(0,Ack(0,Ack(1,n?2)))=Ack(0,Ack(0,Ack(0,Ack(1,n?3))))=......=Ack(...,Ack(1,0)...)=Ack(...,Ack(0,1)...)=......=n+2Ack(2,n)=Ack(1,Ack(2,n?1))=Ack(1,Ack(1,Ack(2,n?2)))=Ack(1,Ack(1,Ack(1,Ack(2,n?3))))=......=Ack(...,Ack(2,0)...)=Ack(...,Ack(1,1)...)=......=2n+3Ack(3,n)=Ack(2,Ack(3,n?1))=Ack(2,Ack(2,Ack(3,n?2)))=Ack(2,Ack(2,Ack(2,Ack(3,n?3))))=......=Ack(...,Ack(3,0)...)=Ack(...,Ack(2,1)...)=......=2n+3?3Ack(4,n)=Ack(3,Ack(4,n?1))=Ack(3,Ack(3,Ack(4,n?2)))=Ack(3,Ack(3,Ack(3,Ack(4,n?3))))=......=Ack(...,Ack(4,0)...)=Ack(...,Ack(3,1)...)=......=(有n+3個2)2222...2?3Ack(0,n)=n+1\\Ack(1,n)=Ack(0,Ack(1,n-1))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(0,Ack(0,Ack(1,n-2)))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(0,Ack(0,Ack(0,Ack(1,n-3))))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=......\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(...,Ack(1,0)...)\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(...,Ack(0,1)...)\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=......\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=n+2\\Ack(2,n)=Ack(1,Ack(2,n-1))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(1,Ack(1,Ack(2,n-2)))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(1,Ack(1,Ack(1,Ack(2,n-3))))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=......\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(...,Ack(2,0)...)\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(...,Ack(1,1)...)\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=......\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=2n+3\\Ack(3,n)=Ack(2,Ack(3,n-1))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(2,Ack(2,Ack(3,n-2)))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(2,Ack(2,Ack(2,Ack(3,n-3))))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=......\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(...,Ack(3,0)...)\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(...,Ack(2,1)...)\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=......\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=2^{n+3}-3\\Ack(4,n)=Ack(3,Ack(4,n-1))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(3,Ack(3,Ack(4,n-2)))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(3,Ack(3,Ack(3,Ack(4,n-3))))\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=......\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(...,Ack(4,0)...)\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=Ack(...,Ack(3,1)...)\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=......\\\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space\space=(有n+3個2)2^{2^{2^{2^{^{...^2}}}}}-3Ack(0,n)=n+1Ack(1,n)=Ack(0,Ack(1,n?1))?????????????????=Ack(0,Ack(0,Ack(1,n?2)))?????????????????=Ack(0,Ack(0,Ack(0,Ack(1,n?3))))?????????????????=......?????????????????=Ack(...,Ack(1,0)...)?????????????????=Ack(...,Ack(0,1)...)?????????????????=......?????????????????=n+2Ack(2,n)=Ack(1,Ack(2,n?1))?????????????????=Ack(1,Ack(1,Ack(2,n?2)))?????????????????=Ack(1,Ack(1,Ack(1,Ack(2,n?3))))?????????????????=......?????????????????=Ack(...,Ack(2,0)...)?????????????????=Ack(...,Ack(1,1)...)?????????????????=......?????????????????=2n+3Ack(3,n)=Ack(2,Ack(3,n?1))?????????????????=Ack(2,Ack(2,Ack(3,n?2)))?????????????????=Ack(2,Ack(2,Ack(2,Ack(3,n?3))))?????????????????=......?????????????????=Ack(...,Ack(3,0)...)?????????????????=Ack(...,Ack(2,1)...)?????????????????=......?????????????????=2n+3?3Ack(4,n)=Ack(3,Ack(4,n?1))?????????????????=Ack(3,Ack(3,Ack(4,n?2)))?????????????????=Ack(3,Ack(3,Ack(3,Ack(4,n?3))))?????????????????=......?????????????????=Ack(...,Ack(4,0)...)?????????????????=Ack(...,Ack(3,1)...)?????????????????=......?????????????????=(有n+3個2)2222...2?3
接下來的Ack(m,n)Ack(m,n)Ack(m,n)就以此類推。
假如讓你用python或C++或Java編寫,你會嗎?
下面是參考答案(均用遞推方式):
python編寫
#函數部分 def Ack(m,n):if m==0:return n+1elif n==0:return Ack(m-1,1)else:return Ack(m-1,Ack(m,n-1)) #輸入部分 m=int(input("")) n=int(input("")) print(Ack(m,n))C++編寫
#include<iostream> using namespace std; //函數部分 long long Ack(int m,int n){if(m==0){return n+1;}else if(n==0){return Ack(m-1,1);}else{return Ack(m-1,Ack(m,n-1))} } //main部分 int main(){int m,n;cin>>m>>n;cout<<Ack(m,n)<<endl;return 0; }Java編寫
import java.util.Scanner; public class Ack{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt();int n = sc.nextInt();System.out.println(ackerman(m,n));}public static long ackerman(long m, long n) {if (m < 0 || n < 0)return -1;else if (m == 0)return n + 1;else if (m > 0 && n == 0)return ackerman(m - 1, 1);else //m>0 and n>0return ackerman(m - 1, ackerman(m, n - 1));} }小結
今天我們知道了阿克曼函數的定義和規律,還寫了python和C++以及java的程序。
總結
- 上一篇: vim查找和替换字符串
- 下一篇: 信息展示类图表设计指南:10个必须遵循的