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