在数学上有一个著名的“阿克曼函数”,它是二元函数,其定义式为:

(1)ACK(0, N)=1+N

(2)ACK(M,0)= ACK(M-1, 1)(M>0)

(3)ACK(M, N) = ACK(M-1,ACK(M, N-1)) (M>0, N>0)

试用手工求解ACK(3, 7) 的值。

因为这个函数是用递归方式定义的,如果使用递归算法编程求解并不困难。但是,要解这个具体问题,还必须经过将近 70万次 (693964次) 递归调用 !

显然,局限于递归算法,要想用手工求解这个问题是极其困难的,甚至是不可能的!

要想能用手工求解这个困难问题,唯有另想办法,另辟蹊径。

本文给出手工求解这个难题的一种高效算法。

这种高效率算法的基本思路是:先将这个二元函数 ACK(M,N) 的函数值排成一个对应的M行N列的二维数组,并将此数组每一行视为一个数列。只要能求得第M- 1行对应数列的首项值和通项公式:

ACK(M-1,0)和 ACK(M-1,N)= f(N),

然后,根据式 (2)和式 (3),即可以得到第M行对应数列的首项值

ACK(M,0)= ACK(M-1, 1)

和数列中相邻项的关系公式:

ACK(M,N)= ACK(M-1,ACK(M, N-1))= f [ACK(M,N-1)]

据此,依次推导出M=0,M=1,M=2时对应的数列通项公式后,即可以得到待求的 ACK(3,4) 的函数值了。

(注意:因为各个数列首项N=0,对应的 n=1,所以有:n= N+1。)

具体求解步骤如下:

1、式(1)就是M=0对应通项公式。这是一个首项的值为 1,公差为1的等差数列。

2、推导M=1对应数列的通项公式。

由式(2)和式(1)可得到数列的首项(N=0)的值为:

(4)ACK(1,0)=ACK(0,1)=1+1=2

由式(3)和式(1)可得到数列中相邻两项的关系公式为:

(5)ACK(1,N)= ACK(1,N-1)+ 1

(6)ACK(1,N)= 2 + N 。

3、推导M=2对应数列的通项公式。

由式(2)和式(6)可得到数列的首项(N=0)的值为

(7)ACK(2,0)=ACK(1,1) =2+1= 3 ,

由式(3)和式(6)可得到数列相邻项的关係公式:

(8)ACK(2, N)= ACK(1,ACK(2, N-1))= 2 + ACK(2, N-1)

显然,这是一个公差为2 的等差数列。

综合式(7)和式(8)得到:M=2对应的数列是一个首项为3,公差为 2的等差数列。通项公式为:

(9)ACK(2,N)=3 + 2*N 。

4、等待求值的ACK(3, 7)属于M=3对应的数列。为了求ACK(3, 7)的值,先推导M=3对应数列的首项(N=0)值和数列相邻项的关係公式。

由式(2)和式(9),可得到数列的首项(N=0)的值为

(10)ACK(3,0)=ACK(2,1)=3 + 2*1=5

由式(3)和式(9)可得到数列相邻项的关係公式:

(11) ACK(3, N)= ACK(2,ACK(3, N-1))= 3 + 2*ACK(3, N-1) 。

根据M=3对应数列的这个两个基本特牲,有两种可供选择的求值方法。

方法一:求数列通项公式法。

式(11)表明:当M=3时对应的数列,它的相邻项之间的关系是一种典型的线性关系,其通式为:

An+1= K* An + B 。(K和B是常数)。

下面讨论:在这样的相邻项关系条件下的数列通项公式推导方法。

1、当K=0时,这是一个常数列:An = B ;

2、当K=1,B=0时,这也是一个常数列:An = A1 ;

3、当K≠1,B=0时,这是一个公比为K的等比数列,An =Kn -1 *A1 ;

4、一般情况(当K≠0,1,B≠0时):

A2 =K* A1 + B

A3 =K* A2 + B=K*(K* A1 + B)+ B=K2 *A1 + B*K + B

… …

An =Kn -1 *A1 + ( B*K n -2 + B*K n -3 + … + B*K 1+ B )

注意 :括号中就是“首项为B,公比为K的等比数列的前(n -1)项之和”!

根据等比数列的前(n -1)项的求和公式,得到括号中的求和结果

Sn= B*= *Kn –1 - ,

从而得到结论:当相邻项之间的关系是An+1= K* An + B 时,数列的通项公式为

(12) An =Kn -1 *A1 + Sn=Kn -1 *(A1+)- 。 ( n=1,2,3, …)

具体到本文的问题,对照(10)式和(11)式知道:A1 = ACK(3, 0) = 5, K=2,B=3。

代入(12)式,并注意到 n=N+1, 就可以得到M=3对应数列的通项公式 :

(13) ACK(3,N) = 2N*(5+)- = 2N + 3 - 3。

将N=7代入(13)式,立即得到答案:

ACK(3,7)= 27+ 3 - 3 = 1021 。

方法二:递推法。

根据(10)式知道:A1 = ACK(3,0)=5,

再根据(11)式: ACK(3, N)= 3 + 2*ACK(3, N-1) 逐项进行递推求解:

ACK(3,1)=2*5+3=13

ACK(3,2)=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

matlab阿卡曼公式,阿克曼函数--一个计算方法相关推荐

  1. matlab求解一元四次函数,excel数据函数参数是四个吗|求一个简单的一元四次函数的最大值...

    求四次函数的最值 先求导,令导数等于0,求出x的值,判断单调性,将x代入原函数 4次幂的一元函数怎么计算 解析: (1) 四次方程,有通用求根公式. A 此公式复杂,实际使用较麻烦 B 其推导过程中可 ...

  2. Excel公式与函数——每天学一个

    1. 根据刘伟的视频讲解进行总结,网上讲Excel公式与函数的貌似就他讲的还不错.在他的微博里看到现在的照片胖了不少,不过还挺帅的,不再是以前那个小屌丝了. 2. 一共53个视频,去掉一个开头,去掉一 ...

  3. excel vba 调用webbrowser_VBA 公式与函数

    一, 在单元格中输入公式的3种方法: 1) 用VBA在单元格中输入普通公式 Sub formula_1() Range("d2") = ("=B2 * C2") ...

  4. 计算机函数说课ppt,《excel公式与函数》说课稿

    尊敬的各位评委老师: 你们好!我今天说课的题目是<统计零用钱支出数据>项目中的子项目一<excel公式与函数>的应用. 首先是我的说课环节,我将会从教材分析.学情分析.教法与学 ...

  5. matlab进行道格拉斯筛选,用MATLAB计算柯布道格拉斯函数,需要计算程序,急!谢谢大神...

    用MATLAB计算柯布道格拉斯函数,需要计算程序,急!谢谢大神0 产值.资金.劳动力关系函数问题具体内容增加生产.发展经济所依靠的主要因素有增加投资.增加劳动力以及技术革新等,在研究国民经济产值与这些 ...

  6. matlab中如何处理复数,matlab中复数的处理函数

    matlab中复数的处理函数 MATLAB 中复数的处理函数要说明复数的运算,先从解以下的二次方程式的复数根谈起上式的根有实部 (-2) 及虚部 (±3),我们就这个复数的表示法来说明 MATLAB的 ...

  7. 软阈值函数作用图matlab,软阈值(Soft Thresholding)函数解读

    题目:软阈值(Soft Thresholding) 函数解读 1.软阈值(Soft Thresholding)函数的符号 软阈值(Soft Thresholding)目前非常常见,文献[1][2]最早 ...

  8. ACM Ackermann function(阿克曼函数)

    这个问题真没想到,没留意M最大只有3,也完全没有想到用公式啥的,当时没往这方面想,直接按递归公式写的算法,结果狠狠的巴掌:超时了.... 问题描述 众所周知,阿克曼函数中扮演一个重要的角色在理论计算机 ...

  9. matlab中用公式求pi值,matlab用π 4公式求π的近似值,直到某一项的绝对值小于10-6为止...

    求问matlab计算的几个公式以及方法. 峰值max峭度应该就是梯度了gradient曲线画图:plot(二维)plot3(三维),其他画图都用这个就够了查matlab文档 求matlab高手,这个公 ...

  10. MATLAB 利用三点进行函数曲线拟合 + 如何评价拟合曲线好坏

    根据以下帖子整理: 一.用函数方式实现曲线拟合 http://www.cnblogs.com/linkr/p/3632032.html https://blog.csdn.net/sinat_2026 ...

最新文章

  1. springboot 多线程_SpringBoot异步调用@Async
  2. 一生中用来开会的时间,你知道有多久吗?
  3. 如何用openvr api打开vive前置摄像头
  4. SAP CRM BSP component在test mode下launch的执行顺序
  5. 【已解决】iView-admin Editor 组件 绑定默认值问题
  6. Emacs进阶之选择当前word/line
  7. WebStorm导入git.exe报错 Empty git --version output:
  8. re模块和正则表达式
  9. SpringBoot项目进行单元测试
  10. java替换特殊字符_Java处理特殊字符替换(正则表达式)
  11. 游戏是怎么赚钱的?(科普篇 )
  12. 房价收入比最高20倍 相关专家认为楼市泡沫已现
  13. 使用000webhost.com免费主机搭建一个WordPress站点
  14. 老大告诉我不要用字符串存IP地址,不兴~
  15. 类的成员函数指针和静态成员函数指针 调用成员函数***
  16. 10 个超好用的免费开源项目管理软件
  17. 记2013移动开发者大会之行
  18. 免费小程序开发平台有哪些功能对零售超市行业有利?
  19. iptables 防火墙中的SNAT和DNAT
  20. 如何重置postgresql用户密码

热门文章

  1. webm格式怎么转换成mp4?几步就能够完成转换
  2. 虚拟机VMware安装学习过程中遇到的几个问题
  3. Solr(一) Solr 简介及搜索原理
  4. idea调试jdk源码
  5. web压力测试的几个指标
  6. 思科命令配置使用方法介绍
  7. python音乐爬虫_Python爬虫实践 —— 4.好听音乐网轻音乐资源下载
  8. java中希腊字母表_希腊字母,希腊字母
  9. 【数据分析面试】大厂高频SQL笔试题(二)
  10. java调用sqluldr_java 使用 oracle sqluldr2 快速导出数据文件