阿克曼函数是非原始递归函数的例子;它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高,仅是(4,3)的输出已大得不能准确计算。
1920年代后期,数学家大卫·希尔伯特的学生Gabriel Sudan和威廉·阿克曼,当时正研究计算的基础。Sudan发明了一个递归却非原始递归的Sudan函数。1928年,阿克曼又独立想出了另一个递归却非原始递归的函数。他最初的念头是一个三个变量的函数A(m,n,p),使用康威链式箭号表示法是m→n→p。阿克曼证明了它是递归函数。希尔伯特在On the Infinite猜想这个函数不是原始递归。阿克曼在On Hilbert’s Construction of the Real Numbers证明了这点。后来Rozsa Peter和Raphael Robinson定义了一个类似的函数,但只用两个变量。
定义:
{ n+1; m=0,n>0
A(m,n) = { A(m-1,1); n=0,m>0
{ A(m-1,A(m,n-1)) n>0,m>0
代码实现
首先肯定得写个递归函数,这道题的递归知识并不复杂,照着题目写就行了
递归函数
int 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));
}
}
没错,就这么简单。
完整程序
#include<bits/stdc++.h>
using namespace std;
int 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 m,n;
cin>>m>>n;
cout<<ack(m,n);
}