码迷,mamicode.com
首页 > 其他好文 > 详细

14、蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数

时间:2015-06-24 09:27:31      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:

14、蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数

本篇名言:“今天就是生命 ----- 是唯一你能确知的生命。

继续递归应用,阿克曼函数。

 欢迎转载,转载请标明出处:

1.  阿克曼函数

阿克曼函数(Ackermann)是非原始递归函数的例子。它需要两个自然数作为输入值,输出一个自然数。它的输出值增长速度非常高,仅是对于(4,3)的输出已大得不能准确计算。

Ackermann函数定义如下:

技术分享

若m=0,返回n+1。

若m>0且n=0,返回Ackermann(m-1,1)。

若m>0且n>0,返回Ackermann(m-1,Ackermann(m,n-1))。

 

 

1920年代后期,数学家大卫·希尔伯特的学生GabrielSudan和威廉·阿克曼,当时正研究计算的基础。Sudan发明了一个递归却非原始递归的Sudan函数。1928年,阿克曼又独立想出了另一个递归却非原始递归的函数。

他最初的念头是一个三个变数的函数A(m,n,p),使用康威链式箭号表示法是m→n→p。阿克曼证明了它是递归函数。希尔伯特在On the Infinite猜想这个函数不是原始递归。阿克曼在On Hilbert‘s Construction of the Real Numbers证明了这点。

后来Rozsa PeterRaphael Robinson定义了一个类似的函数,但只用两个变数。

 

 

2.  源码

实现如下图1所示:

#include <stdio.h>

#include <stdlib.h>

 

int Ackmann(int m,int n)

{

         if(m==0)

                   return n+1;

         else if(m>0&& n==0)

                   returnAckmann(m-1,1);

         else

                   returnAckmann(m-1,Ackmann(m,n-1));

}

int main()

{

         intm,n,r;

         printf("输入mn\n");

         scanf("%d%d",&m,&n);

         r =Ackmann(m,n);

         printf("结果是:%d\n",r);

         system("pause");

         return0;

}

 技术分享

 

 

 

 

 

 

 

 

 

 

14、蛤蟆的数据结构笔记之十四栈的应用之栈与递归之阿克曼函数

标签:

原文地址:http://blog.csdn.net/notbaron/article/details/46611607

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!