【经典算法实现 14】阿克曼函数(手动推导求解、递归实现、非递归实现)
【经典算法实现 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】阿克曼函数(手动推导求解、递归实现、非递归实现)相关推荐
- 二叉树创建及遍历算法(递归及非递归)(转)
//二叉树处理头文件 //包括二叉树的结构定义,二叉树的创建,遍历算法(递归及非递归), /* 作者:成晓旭 时间:2001年10月7日(18:49:38-20:00:00) 内容:完成二叉树创建,二 ...
- 傅里叶变换算法c语言实现(递归与非递归)
1.算法设计原理分析 把傅里叶变换公式进行拆分,按奇偶进行分组,使之转外为两个T(n/2)的计算式. 这样就可以找到了递归特性,可以一直拆分下去,直到一组只有一个数值.递归算法实现则可以为在每次递归中 ...
- C++第七次作业(函数_递归与非递归_多文件)
文章目录: 一:C++递归与非递归实现整数的阶乘 代码实现 运行结果 二:C++递归与非递归实现Fibonacci数列的计算:a0=1; a1=1; a2=a0+a1; a3=a1+a2; ..... ...
- 树与二叉树的深度优先与广度优先算法(递归与非递归)
本博客前面文章已对树与二叉树有过简单的介绍,本文主要是重点介绍有关二叉树的一些具体操作与应用 阅读本文前,可以先参考本博客 各种基本算法实现小结(三)-- 树与二叉树 和 各种基本算法实现小结( ...
- 九十五、二叉树的递归和非递归的遍历算法模板
@Author:Runsen 刷Leetcode,需要知道一定的算法模板,本次先总结下二叉树的递归和非递归的遍历算法模板. 二叉树的四种遍历方式,前中后加上层序遍历.对于二叉树的前中后层序遍历,每种遍 ...
- 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
本题来自左神<程序员代码面试指南>"分别用递归和非递归方式实现二叉树先序.中序和后序遍历"题目. 题目 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点 ...
- 算法之快速排序(递归和非递归)
快速排序的两种实现方式.递归和非递归 1 package com.ebiz.sort; 2 3 import java.text.SimpleDateFormat; 4 import java.uti ...
- 编写函数 int fac(int x)计算 x!的值。在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac)
编写函数 int fac(int x)计算 x!的值.在主函数中输入 n 和 m 的值,通过调用函数 fac 计算m Cn 的值(要求分别用递归和非递归的方法编写函数 fac) 递归: #includ ...
- 树的递归与非递归遍历算法
树的递归与非递归遍历算法 树的递归与非递归遍历算法 树的遍历 实例 树遍历的口诀 树的递归遍历代码 树的先序遍历 树的中序遍历 树的后序遍历 递归遍历思想 树的非递归遍历 树的先序非递归遍历 先序遍历 ...
- c语言中fact函数怎么调用,C语言程序题: 1、编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现...
点击查看C语言程序题: 1.编写一个求n!的函数fact(n),要求fact函数分别用递归和非递归两种方法实现具体信息 答:int fac(int n) //非递归{int f=1; for(;n;) ...
最新文章
- centos7中使用yum安装tomcat mysql 等
- 锁优化:逃逸分析、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁
- Python工作笔记-往dll中传入char*类型的参数并且如何接收char*的值
- 5页面放大再正常显示_一加5/5TFlyme8 9.9.24 功能一览
- [译]Perl中的数组
- IE与FireFox的不同点(不断更新中..)
- Java突击学习 Day1
- java执行db2命令_送你一份P6级Java面试题
- CSipsimple最新版本编译
- android studio查看应用文件,AndroidStudio里面使用openFileOutput新建的文件如何查看
- 供应商关系管理系统SRM
- hdu 5510 strstr/find/KMP
- echarts生成三维柱状图
- win7电脑怎么伪装ip地址【系统天地】
- 2022起重机司机(限门式起重机)考试题模拟考试题库及在线模拟考试
- 手机、电脑、服务器电子数据现场勘验攻略(超级全!)
- 上海首届暑期大学生实习专场,名头看上去非常不错,决定去体验一下招聘会,看看自己的简历会被如何的无视..
- Pyhotn3,爬取B站up主的信息!
- Richardson外推加速技术(含Romberg详细分析)的Matlab实现
- skyfire Sorry. Skyfire Cannot Provide Service In Your Country.解决 天火浏览器不能使用问题。...