与谁讨论非递归阿克曼函数?
Who to talk to about non recursive Ackermann function?
我已经为 Ackermann 函数编写了一个非递归解决方案,它似乎工作完美并且比常见的递归解决方案工作得更快。所以我很困惑,如果它可以迭代解决,为什么它是一个非原始递归函数?如果我对什么是原始递归函数有误解,或者我应该和谁谈谈以获得答案,谁能告诉我?
下面是 Java 代码:
import java.util.Scanner;
import java.util.ArrayList;
public class ackermann {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("Enter m:");
int m = in.nextInt();
System.out.println("Enter n:");
int n = in.nextInt();
ack(m, n);
}
public static void ack(int inM, int inN){
if(inM < 0 || inN < 0) return;
ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
for(int m = 0; m <= inM; m++){
arr.add(new ArrayList<Integer>());
}
Boolean done = false;
while(done == false){
for(int m = 0; m <= inM; m++){
int n = arr.get(m).size();
int a = 0;
if(m == 0) a = n + 1;
else if(n == 0){
if(arr.get(m - 1).size() <= 1) break;
a = arr.get(m - 1).get(1);
} else {
int k = arr.get(m).get(n - 1);
if(arr.get(m - 1).size() <= k) break;
a = arr.get(m - 1).get(k);
}
arr.get(m).add(a);
if(m == inM && n == inN){
System.out.println("Ack(" + inM + ", " + inN + ") = " + a);
done = true;
break;
}
}
}
}
}
原始递归函数可以仅使用赋值、+ 和确定循环来实现。我的意思是以下形式的循环:
for(int i = 0; i < n; i++) { ... }
其中 n 是在循环体中未更改的变量。要获得主要化所有原始递归函数的 Ackermann 函数,需要添加 goto 命令或无限循环,如 while 循环。
我已经为 Ackermann 函数编写了一个非递归解决方案,它似乎工作完美并且比常见的递归解决方案工作得更快。所以我很困惑,如果它可以迭代解决,为什么它是一个非原始递归函数?如果我对什么是原始递归函数有误解,或者我应该和谁谈谈以获得答案,谁能告诉我?
下面是 Java 代码:
import java.util.Scanner;
import java.util.ArrayList;
public class ackermann {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
System.out.println("Enter m:");
int m = in.nextInt();
System.out.println("Enter n:");
int n = in.nextInt();
ack(m, n);
}
public static void ack(int inM, int inN){
if(inM < 0 || inN < 0) return;
ArrayList<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
for(int m = 0; m <= inM; m++){
arr.add(new ArrayList<Integer>());
}
Boolean done = false;
while(done == false){
for(int m = 0; m <= inM; m++){
int n = arr.get(m).size();
int a = 0;
if(m == 0) a = n + 1;
else if(n == 0){
if(arr.get(m - 1).size() <= 1) break;
a = arr.get(m - 1).get(1);
} else {
int k = arr.get(m).get(n - 1);
if(arr.get(m - 1).size() <= k) break;
a = arr.get(m - 1).get(k);
}
arr.get(m).add(a);
if(m == inM && n == inN){
System.out.println("Ack(" + inM + ", " + inN + ") = " + a);
done = true;
break;
}
}
}
}
}
原始递归函数可以仅使用赋值、+ 和确定循环来实现。我的意思是以下形式的循环:
for(int i = 0; i < n; i++) { ... }
其中 n 是在循环体中未更改的变量。要获得主要化所有原始递归函数的 Ackermann 函数,需要添加 goto 命令或无限循环,如 while 循环。