EXCEL单元格公式-实现阿克曼函数计算

这篇博客介绍了如何使用Excel来实现著名的阿克曼函数,这是一种非原始递归函数,具有极快的增长速度。通过伪代码展示了函数的逻辑,并利用Excel的IF和INDIRECT函数构建了一个动态计算表。博主详细解释了公式的工作原理,以及如何在Excel中填充和复制以生成阿克曼函数的值表。计算结果显示,随着参数的增加,函数的值迅速变得无法精确计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一·简介

二·程序

完整程序

程序解析

三·使用方法


一·简介

阿克曼函数(ACKERMANN)

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

大致实现:【伪代码】

func Ackermann(m,n){
if m=0 -> return n+1;
else if n=0 -> return Ackermann(m-1,1);
else -> return Ackermann(m-1,Ackermann(m,n-1));
}

大概就是这样的,它的增长速度非常之快,可以用二维表进行解决:

注:竖列为m,横列为n,第一行为n=0,第一列为m=0

空值为因参数不足而无法计算

Ackermann
1235
23513
347
459
5611
6713
7815
8917
91019
1011
1112
1213
1314
1415
1516
1617
1718
1819
1920
20

二·程序

完整程序

右滑以查看完整程序

=IF(IF(COLUMN()=1,ROW(),IF(ROW()=1,INDIRECT(ADDRESS(2,COLUMN()-1)),INDIRECT(ADDRESS(INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1,COLUMN()-1))))=0,"",IF(COLUMN()=1,ROW(),IF(ROW()=1,INDIRECT(ADDRESS(2,COLUMN()-1)),INDIRECT(ADDRESS(INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1,COLUMN()-1)))))

程序解析

第一个IF表示判断结果是否为0;若为0(最小为1)则表示无法计算,填充以"",即空单元格(填充别的会造成在二次计算时造成的错误)。

这是主体计算:

IF(COLUMN()=1,ROW(),IF(ROW()=1,INDIRECT(ADDRESS(2,COLUMN()-1)),INDIRECT(ADDRESS(INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1,COLUMN()-1))))

第二个IF则为判断如果列号为1(起始为1),则表示m=0,则结果为行号加1。

这里要解释一下,因为Excel行列号起始为1,而我们的表格起始为0,就表示所有的行列号都比应该的大1。

剩余部分

IF(ROW()=1,INDIRECT(ADDRESS(2,COLUMN()-1)),INDIRECT(ADDRESS(INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1,COLUMN()-1)))

接下来的判断则为判断是否行号为1,如果是则执行:

INDIRECT(ADDRESS(2,COLUMN()-1))

ADDRESS表示行列号对应的坐标。INDIRECT获取ADDRESS的值。表示为获取第二行的第(行标-1)列的值。

如果不是则执行:

INDIRECT(ADDRESS(INDIRECT(ADDRESS(ROW()-1,COLUMN()))+1,COLUMN()-1))

表示获取(第(列标)列的第(行标-1)行的值+1为新的行标,(列标-1)为新的列标)的值。

三·使用方法

复制程序到A1格,下拉单元格复制到A列的你想要的格子;

选中整个A列,右拉复制到你想要的列。

接下来就是Ackermann函数的值的表。

(有可能复制后显示为空值,那是因为根据现有的数据无法计算,只需要将A列的值多下拉几行即可)

这是本人的结果:

123513
23513
34729
45961
5611125
6713
7815
8917
91019
101121
111223
121325
131427
141529
151631
161733
171835
181937
192039
202141
212243
222345
232447
242549
252651
262753
272855
282957
293059
303161
313263
323365
333467
343569
353671
363773
373875
383977
394079
404181
414283
424385
434487
444589
454691
464793
474895
484997
495099
5051101
5152103
5253105
5354107
5455109
5556111
5657113
5758115
5859117
5960119
6061121
6162123
6263125
6364127
6465129
6566131
6667133
6768135
6869137
6970139
7071141
7172143
7273145
7374147
7475149
7576151
7677153
7778155
7879157
7980159
8081161
8182
8283
8384
8485
8586
8687
8788
8889
8990
9091
9192
9293
9394
9495
9596
9697
9798
9899
99100
100101
101102
102103
103104
104105
105106
106107
107108
108109
109110
110111
111112
112113
113114
114115
115116
116117
117118
118119
119120
120121
121122
122123
123124
124125
125126
126127
127128
128129
129130
130131
131132
132133
133134
134135
135136
136137
137138
138139
139140
140141
141142
142143
143144
144145
145146
146147
147148
148149
149150
150151
151152
152153
153154
154155
155156
156157
157158
158159
159160
160161
161
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unconquerable p

给点吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值