生活资讯
阿克曼函数 、阿克曼函数非递归算法
2023-04-13 00:46  浏览:45

关于阿克曼函数的非递归算法 满意加300 C语言高手求解 在线等

楼主如果要加300分,可能要开2贴了,因为1贴最多只能200分,追加最多只能50分。

你给的那个解法,写的本来就有问题。

不信,你自己试试这个程序:

#includestdio.h

//非递归解法

int akm_nonrecursive(int m, int n)

{

int m1[50], n1[50], cp;

cp = 0;

m1[0] = m;

n1[0] = n;

do {

while (m1[cp] 0) {

while (n1[cp] 0) {

cp++;

m1[cp] = m1[cp - 1];

n1[cp] = n1[cp - 1] - 1;

}

m1[cp] = m1[cp] - 1;

n1[cp] = 1;

}

cp--;

m1[cp] = m1[cp] - 1;

n1[cp] = n1[cp + 1] + 1;

} while (cp 0 || m1[cp] 0);

return n1[0] + 1;

}

int main()

{

printf("%dn",akm_nonrecursive(0,2));

printf("%dn",akm_nonrecursive(2,0));

printf("%dn",akm_nonrecursive(2,3));

return 0;

}

当m=0,1,2,3时,阿克曼函数的公式是什么?

m=0时,A(0,n)=n+1。

m=1时,A(1,n)=n+2。

m=2时,A(2,n)=2n+3。

m=3时,A(3,n)=2^(n+3)-3。

总公式:A(m,n)=2(第m级运算)(n+3)-3

如A(3,8)=2^11-3=2045

A(5,1)=2↑↑↑4-3=2↑↑2↑↑4-3=2↑↑65536-3=2^2^2^2^……^2-3(一共有65536个2相乘方)

阿克曼函数的定义

Ackermann函数定义如下: 若m=0,返回n+1。

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

若m0且n0,返回Ackermann(m-1,Ackermann(m,n-1))。

请问如何理解阿克曼函数 刚接触递归 对阿克曼函数不是很了解 求高人给出一个数学展开式 ack(2,2)的就行

阿克曼Ackerman函数A(m,n)的vb程序设计

阿克曼Ackerman函数A(m,n)是所谓的双递归函数(函数以及它的一个变量由函数自身定义),亦是一个不能消除递归的函数。阿克曼Ackerman函数A(m,n)的自变量均取自然数为值,具体如下:

A(m,n)=n+1 当m=0

A(m,n)= A( m-1,1) 当m0,n=0

A(m,n)= A( m-1,A(m,n-1)) 当m0,n0

一、Vb窗体设计如下:

三个文本框,其中文本框1用于输入m的值,文本框2用于输入n的值,文本框3用于输出结果A(m,n)的值,还有一个用于计算求结果的命令按钮。

二、阿克曼Ackerman函数A(m,n)vb程序如下:(调试程序时不能用太大的数字)

Private Sub Command1_Click()

m = Val(Text1.Text)

n = Val(Text2.Text)

Text3.Text = a(m, n)

End Sub

Function a(ByVal m As Integer, ByVal n As Integer) As Long

If m = 0 Then a = n + 1

If m 0 And n = 0 Then a = a(m - 1, 1)

If m 0 And n 0 Then a = a(m - 1, a(m, n - 1))

End Function

三、用阿克曼Ackerman函数计算A(3,8)、A(2,10)、A(3,3)的值如下:

1、A(3,8)=2045

2、A(2,10)=23

3、A(3,3)=61

========================================

您的问题==我的课题 奉献知识==辉煌生命

黑龙江省 张志晨

========================================

下面是我在电子表格里用VBA做的过程展示:

代码设计如下:

Dim b(1000) As Long

Dim k As Integer

Dim x(1000), y(1000)

Sub Command1_Click()

k = 0

m = 2

n = 3

Cells(1, 1) = a(m, n) '在A1里显示最终函数值

For i = 1 To k

Cells(i, 3) = x(i) '在C列显示M的变化

Cells(i, 4) = y(i) '在D列显示N的变化

Cells(i, 5) = b(i) '在E列显示A的变化,也就是函数值的变化过程

Next

End Sub

Function a(ByVal m As Integer, ByVal n As Integer) As Long

k = k + 1

If m = 0 Then a = n + 1

If m 0 And n = 0 Then a = a(m - 1, 1)

If m 0 And n 0 Then a = a(m - 1, a(m, n - 1))

x(k) = m

y(k) = n

b(k) = a

End Function

演示结果:

M N A

. . 0

. . 0

. . 0

. . 0

. . 0

1 0 2

1 0 2

2 0 3

. . 0

. . 0

. . 0

1 0 2

1 0 2

1 1 3

1 2 4

2 1 5

. . 0

. . 0

. . 0

. . 0

. . 0

1 0 2

1 0 2

1 1 3

1 2 4

1 3 5

1 4 6

2 2 7

. . 0

. . 0

. . 0

. . 0

. . 0

. . 0

. . 0

. . 0

1 0 2

1 1 3

1 2 4

1 3 5

1 4 6

1 5 7

1 6 8

2 3 9

...........

a(2,3)=9

..........

上面的数据中的小点“.”是我为了对齐数列而用的占位符,与实际效果无关。

阿克曼函数的介绍

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

用C++求阿克曼函数值的问题

这个代码是没有问题的,可以实现阿克曼函数的功能,我是用c语言试的,修改了一下输入输出函数,给m,n赋了初值,结果是对的。可以实现你想要的功能。

关于阿克曼函数和阿克曼函数非递归算法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

发表评论
0评