【经典算法实现 14】阿克曼函数---手动推导求解、递归实现、非递归实现

  • 一、阿克曼函数 手动求解
  • 二、阿克曼函数 递归实现
  • 三、阿克曼函数 非递归实现

该题目来自腾讯实习生的招聘笔试,题目给出如下的递归函数,求ack(3,3)的值。

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));}
}

题目来自:《【腾讯笔试】已知递归函数计算ack(3,3)的值》

一、阿克曼函数 手动求解

ack(0, n) = n+1
ack(m, 0) = ack(m-1, 1)
ack(m, n) = ack(m-1, ack(m, n-1))由此可见,m 每一行,都是一个等差数列推导公式
=======>  当 m = 1 时
ack(1, 0) = ack(0, 1) = 1 + 1 = 2
ack(1, n) = ack(1, n-1 ) +1  = 2 + N=======>  当 m = 2 时
ack(2, 0) = ack(1, 1) = 2+1 = 3
ack(2, n) = ack(1, ack(2,n-1)) = 2 + ack(2, n-1) = 2 * N + ack(2, 0) = 2*N + 3
可以得到,m = 2时,是等差为2 的等差数列=======>  当 m = 3 时
ack(3, 0) = ack(2, 1) = 2 * 1 + 3 = 5
ack(3, n) = ack(2, ack(3, n-1)) = 2 * (ack(3, n-1)) + 3 计算如下:
ack(3, 1) = 2 * (ack(3,0)) + 3 = 2 * 5 + 3 = 13
ack(3, 2) = 2 * (ack(3,1)) + 3 = 2 * 13 + 3 = 29
ack(3, 3) = 2 * 29 + 3 = 61
ack(3, 4) = 2 * 61 + 3 = 125
ack(3, 5) = 2 * 125 + 3 = 253
ack(3, 6) = 2 * 253 + 3 = 509
ack(3, 7) = 2 * 509 + 3 = 1021
ack(3, 8) = 2 * 1021 + 3 = 2045
ack(3, 9) = 2 * 1021 + 3 = 2045
ack(3, 10) = 2 * 2045 + 3 = 4093
ack(3, 11) = 2 * 4093 + 3 = 8189
ack(3, 12) = 2 * 8189 + 3 = 16381
ack(3, 13) = 2 * 16381 + 3 = 32765=======>  当 m = 4 时
ack(4, 0) = ack(3, 1) = 13
ack(4, n) = ack(3, ack(4, n-1)) = 2 * (ack(4, n-1)) + 3 ack(4, 1) = ack(3, ack(4, 0)) = ack(3, ack(3,1)) = ack(3, 13) = 32765
ack(4, 2) = ack(3, ack(4, 1)) = ack(3, 32765)

可以看到,当计算到 ack(4, 2)时,整个数一定特别大了,人工去算基本是不可能的了。

二、阿克曼函数 递归实现

#include <stdio.h>long long ack(int m, int n)
{if(m == 0){return n+1;}else if(n == 0){return ack(m - 1, 1);}else{printf("m = %d, n = %d\n", m, n);return ack(m - 1, ack(m, n - 1));}
}int main(void)
{int m=0, n=0;long long val=0;while(1){scanf("%d %d", &m, &n);val = ack(m, n);printf("\nack(%d, %d) = %lld\n",m ,n, val);}
}

实际使用计算机计算,由于是递归,做了很多重复的操作,整个求解过程也非常慢,
实测计算 m = 3, n = 6 ,我的电脑用了差不多 6 s

更别说,m = 4 的时候了。

三、阿克曼函数 非递归实现

网上有个兄弟使用java stack 栈来实现的,有兴趣的兄弟可以看下:
《每天刷个算法题20160524:阿克曼函数的递归转非递归解法》
《关于阿克曼函数(akermann)非递归算法的一点见解 c++》

有关C语言的解法,待更新。。。先吃饭

【经典算法实现 14】阿克曼函数(手动推导求解、递归实现、非递归实现)相关推荐

  1. 二叉树创建及遍历算法(递归及非递归)(转)

    //二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...

  2. 傅里叶变换算法c语言实现(递归与非递归)

    1.算法设计原理分析 把傅里叶变换公式进行拆分,按奇偶进行分组,使之转外为两个T(n/2)的计算式. 这样就可以找到了递归特性,可以一直拆分下去,直到一组只有一个数值.递归算法实现则可以为在每次递归中 ...

  3. C++第七次作业(函数_递归与非递归_多文件)

    文章目录: 一:C++递归与非递归实现整数的阶乘 代码实现 运行结果 二:C++递归与非递归实现Fibonacci数列的计算:a0=1; a1=1; a2=a0+a1; a3=a1+a2; ..... ...

  4. 树与二叉树的深度优先与广度优先算法(递归与非递归)

    本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树   和  各种基本算法实现小结( ...

  5. 九十五、二叉树的递归和非递归的遍历算法模板

    @Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...

  6. 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)

    本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...

  7. 算法之快速排序(递归和非递归)

    快速排序的两种实现方式.递归和非递归 1 package com.ebiz.sort; 2 3 import java.text.SimpleDateFormat; 4 import java.uti ...

  8. 编写函数 int fac(int x)计算 x!的值。在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac)

    编写函数 int fac(int x)计算 x!的值.在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac) 递归: #includ ...

  9. 树的递归与非递归遍历算法

    树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...

  10. c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...

    点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...

最新文章

  1. centos7中使用yum安装tomcat mysql 等
  2. 锁优化:逃逸分析、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁
  3. Python工作笔记-往dll中传入char*类型的参数并且如何接收char*的值
  4. 5页面放大再正常显示_一加5/5TFlyme8 9.9.24 功能一览
  5. [译]Perl中的数组
  6. IE与FireFox的不同点(不断更新中..)
  7. Java突击学习 Day1
  8. java执行db2命令_送你一份P6级Java面试题
  9. CSipsimple最新版本编译
  10. android studio查看应用文件,AndroidStudio里面使用openFileOutput新建的文件如何查看
  11. 供应商关系管理系统SRM
  12. hdu 5510 strstr/find/KMP
  13. echarts生成三维柱状图
  14. win7电脑怎么伪装ip地址【系统天地】
  15. 2022起重机司机(限门式起重机)考试题模拟考试题库及在线模拟考试
  16. 手机、电脑、服务器电子数据现场勘验攻略(超级全!)
  17. 上海首届暑期大学生实习专场,名头看上去非常不错,决定去体验一下招聘会,看看自己的简历会被如何的无视..
  18. Pyhotn3,爬取B站up主的信息!
  19. Richardson外推加速技术(含Romberg详细分析)的Matlab实现
  20. skyfire Sorry. Skyfire Cannot Provide Service In Your Country.解决 天火浏览器不能使用问题。...

热门文章

  1. js中的dataset的使用
  2. GB2312-80 汉字机内码
  3. 黑群晖linux删除文件夹命令,手把手教你黑群晖(二)
  4. AppLoader的使用
  5. 汇编中DOSBox的使用
  6. 近世代数--正规子群--群、同态核、同态象的大小关系
  7. 【机器学习】K-means算法Python实现教程
  8. 数据集获取方式和数据加强方式
  9. sqlyog简单入门使用
  10. SQLyog 使用教程