- 北境漫步
-
阿克曼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) 当m>0,n=0
A(m,n)= A( m-1,A(m,n-1)) 当m>0,n>0
一、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
..........
上面的数据中的小点“.”是我为了对齐数列而用的占位符,与实际效果无关。
- 左迁
-
A(m,n)=n+1 当m=0
A(m,n)= A( m-1,1) 当m>0,n=0
A(m,n)= A( m-1,A(m,n-1)) 当m>0,n>0
A(2,2)
=A(1,A(2,1))
=A(1,A(1, A(2, 0)))
=A(1, A(1, A(1, 1)))
=......
-------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 n
0 1 2 3 4 5 6 7 8 9 10 11 12
1 2 3 4 5 6 7 8 9 10 11 12 13
2 3 5 7 9 11 13
3 5 13
4
5
6
m
- 北有云溪
-
计算公式为:
A(m,n)=2(m级运算)(n+3)-3
如A(2,3)=2×6-3=9
A(3,4)=2^7-3=125
A(4,3)=2↑↑6-3=2^2^65536-3
因此说明A(4,3)连计算机都算不出来。的确,2^65536=2.0035×10^19728,然后2的二亿亿亿亿……亿多次方(此处有2466个亿字),计算机肯定不能算它的准确数值。阿克曼函数增长率和高德纳箭号同一等级,但是比康威链和葛立恒数慢。
因此A(2,2)=2×5-3=7