Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 简单循环阿克曼函数_Algorithm_Loops - Fatal编程技术网

Algorithm 简单循环阿克曼函数

Algorithm 简单循环阿克曼函数,algorithm,loops,Algorithm,Loops,如何使用简单的非递归循环编写 import java.util.ArrayList; 公共类线性Rackermann{ 静态ArrayList mList=新ArrayList(); 公共静态长阿克曼(长m,长n){ while(true){ 如果(m==0){ n+=1; if(mList.isEmpty()){ 返回n; }否则{ int index=mList.size()-1; m=mList.get(索引); mList.remove(索引); } }else如果(n==0){ m-

如何使用简单的非递归循环编写

import java.util.ArrayList;
公共类线性Rackermann{
静态ArrayList mList=新ArrayList();
公共静态长阿克曼(长m,长n){
while(true){
如果(m==0){
n+=1;
if(mList.isEmpty()){
返回n;
}否则{
int index=mList.size()-1;
m=mList.get(索引);
mList.remove(索引);
}
}else如果(n==0){
m-=1;
n=1;
}否则{
列表添加(m-1);
n-=1;
}
}
}
公共静态void main(字符串[]args){
系统输出println(ackermann(4,1));
}
}
它使用
mList
而不是堆栈来保存挂起的工作;当堆栈变空时,它可以返回累积值。

下面是Ackermann函数的“迭代”版本 (使用自然数列表)是一个简单的循环,使用尾部递归表示

ackloop (n::0::list) = ackloop (n+1::list)
ackloop (0::m::list) = ackloop (1::m-1::list)
ackloop (n::m::list) = ackloop (n-1::m::m-1::list)
ackloop [m] = m

现在ack(m,n)=ackloop[n,m]。

这是什么样的作业?@Henk:不是作业,只是好奇简单循环的表达能力。显然,Ackermann函数不是原始的递归函数-不可能将其重构为循环。此外,本质上属于理论/架构的问题更适合。这应该做什么,以及它如何补充公认的答案?这是Ackermann函数的非递归实现,检查结果并确保它确实给出相同的结果。除了这个答案,我不明白你到底想得到什么。令人惊讶的是,我们用两种不同的语言编写了几乎完全相同的代码。你是从什么地方复制的,还是你自己编写的代码?我记得我在youtube上看到一个视频,说不可能有非递归实现,我问自己为什么不会,我看不出原因,试过了,这就是我得到的。密码都是我写的。
ackloop (n::0::list) = ackloop (n+1::list)
ackloop (0::m::list) = ackloop (1::m-1::list)
ackloop (n::m::list) = ackloop (n-1::m::m-1::list)
ackloop [m] = m