function - 和谁谈论非递归阿克曼函数?

标签 function recursion iteration primitive 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 是在循环体中不会更改的变量。为了获得阿克曼函数(它主要包含所有原始递归函数),需要添加 goto 命令或像 while 循环一样的不定循环。

关于function - 和谁谈论非递归阿克曼函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27806313/

相关文章:

vba - 如何循环遍历具有拆分单元格的单词表格中的所有单元格

c++ - 类内的模板方法

c++ - 处理程序调用速度: Objective-C vs virtual functions

recursion - 如何在 Coq 中只展开一次递归函数

arrays - Bash,递归中使用相同的变量

python - 使用字典中的键从数据帧中检索值

java - Jsoup - 提取文本

c - 如果全局变量的值在函数中更新,它们的值是否会发生变化?

php - 使用 PHP 创建动态链接

algorithm - 快速排序:迭代或递归