ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ackermann函数——递归习题

2020-05-02 11:41:20  阅读:271  来源: 互联网

标签:216 ackermann 递归 16 2f 习题 2n 10


源于SICP中一道习题。

下面过程计算一个成为Ackermann函数的数学函数:

(define (A x y)
	(cond ((= y 0) 0)
		  ((= x 1) (* 2 y))
		  ((= y 1) 2)
		  (else (A (- x 1)
		           (A x (- y 1))))))

下面各表达式的值是什么:
(A 1 10)
(A 2 4)
(A 3 3)

等价的数学函数表达式为:
f(x,y)={0,y=02y,x=02,y=1f(x1,f(x,y1))),elsef(x,y)=\left\{\begin{matrix} 0 & ,y=0\\ 2y& ,x=0\\ 2 & ,y=1 \\ f(x-1,f(x, y-1)))& ,else \end{matrix}\right.f(x,y)=⎩⎪⎪⎨⎪⎪⎧​02y2f(x−1,f(x,y−1)))​,y=0,x=0,y=1,else​
首先,这个函数是用递归定义的。它包含边界值和递归式。

边界值:
(1) f(x,0)=0f(x,0)=0f(x,0)=0
(2) f(x,1)=2f(x,1)=2f(x,1)=2
(3)f(0,y)=2yf(0,y)=2yf(0,y)=2y
递归式(递推公式):
(1)f(x,y)=f(x1,f(x,y1))f(x,y)=f(x-1, f(x, y-1))f(x,y)=f(x−1,f(x,y−1))


(A 1 10)
(A 2 4)
(A 3 3)
等价于求
f(1,10)f(1,10)f(1,10)
f(2,4)f(2,4)f(2,4)
f(3,3)f(3,3)f(3,3)

f(x,y)f(x,y)f(x,y)的步骤:

  • 先求f(x,y1)=af(x,y-1)=af(x,y−1)=a
  • 然后求f(x1,a)f(x-1,a)f(x−1,a)

问题求解如下:在这里插入图片描述

在这里插入图片描述

(A 3 3)
(A 2 (A 3 2))
(A 2 (A 2 (A 3 1)))
(A 2 (A 2 2))
(A 2 (A 1 (A 2 1)))
(A 2 (A 1 2))
(A 2 (A 0 (A 1 1)))
(A 2 (A 0 2))
(A 2 4)
2162^{16}216

可总结出:

f(0,n)=2nf(0,n)=2nf(0,n)=2n

f(1,n)=f(0,f(1,n1))=2f(1,n1)f(1,n)=f(0,f(1,n-1))=2f(1,n-1)f(1,n)=f(0,f(1,n−1))=2f(1,n−1)
=22f(1,n2)=2n1f(1,1)=2n=2^2f(1,n-2)=2^{n-1}f(1,1)=2^n=22f(1,n−2)=2n−1f(1,1)=2n
在这里插入图片描述

在这里插入图片描述
这个递归函数的设计非常有意思,递归式f(x,y)=f(x1,f(x,y1))f(x,y)=f(x-1, f(x, y-1))f(x,y)=f(x−1,f(x,y−1))非常像一个查表游戏。把递归计算过程视作查表,有利于理解该函数。
假设这张表(矩阵)是存在的。要求f(x,y)f(x,y)f(x,y),首先要查同一行中的前一个元素f(x,y1)f(x,y-1)f(x,y−1),然后利用该值到上一行中查找f(x1,f(x,y1))f(x-1,f(x,y-1))f(x−1,f(x,y−1))。
例如要求f(2,4)f(2,4)f(2,4),先在表中查找前一个元素f(2,3)=16f(2,3)=16f(2,3)=16,然后在上一行中查找f(1,16)=216f(1,16)=2^{16}f(1,16)=216。
同样求f(2,5)f(2,5)f(2,5),先在表中查找前一个元素f(2,4)=216f(2,4)=2^{16}f(2,4)=216,然后在上一行中查找f(1,216)=2216f(1,2^{16})=2^{2^{16}}f(1,216)=2216。

事实上,表是不存在的,在计算f(x,y1)=af(x,y-1)=af(x,y−1)=a和f(x1,a)f(x-1,a)f(x−1,a)时同样需要递归求解。而且对于很小的参数值,递归深度已经非常深。例如求f(2,5)f(2,5)f(2,5)过程中需要求f(1,216)f(1,2^{16})f(1,216),仅查找同一行内的前一元素f(x,y1)f(x, y-1)f(x,y−1)就需要2162^{16}216次。

标签:216,ackermann,递归,16,2f,习题,2n,10
来源: https://blog.csdn.net/zhakngye/article/details/105853993

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有