java - 从递归到迭代

标签 java performance

我花了很长时间尝试将此函数转换为循环,但我找不到实现它的方法。我从 while(m != 0) 开始,然后是里面的条件,但是第三个 if 是不允许我这样做的。

public static int calculatePayment(int n, int m){
    if(m == 0) return n + 1;
    if(n == 0 && m > 0) return calculatePayment(1, m - 1);
    if(n > 0 && m > 0) return calculatePayment(calculatePayment(n - 1, m), m - 1);
    return 0;
}

此外,我不知道我是否需要使用 BigInteger、逆行和倒转程序将运行 StackOverFlow 错误,并且如果我需要它也不会让我知道。

编辑:

第一:

m 在输入中不能小于零,那永远不会发生。 n 的情况相同,代码不需要处理。

到目前为止我有这个:

while(m > 0){
             if(n == 0 && m > 0){n = 1; m--;}
             if(n > 0 && m > 0){m--; n = IDONTKNOWWHAT;}//here n is the value of
                                                        //the payment if n = n - 1
                                                        //and m = m
                                                        //here is the big deal.
            }
if(m == 0) return n + 1;   //or print

而且代码不能简化为数学公式,我试过了。

最佳答案

您似乎正在尝试寻找一种非递归算法来计算阿克曼函数。我不介意这样计算我的薪水:)我猜这是在试图掩饰家庭作业?

无论如何,您可以模拟堆栈并存储中间值,然后就很容易了,参见:How to rewrite Ackermann function in non-recursive style?

顺便说一句,阿克曼的功能增长极快。您可以使用 BigInteger,但无论如何它基本上都是徒劳的。只有几个最小参数才知道函数的确切值。此外,涉及大量递归,因此您需要缓存中间值以推迟 StackOverflow,谷歌关于内存。

关于java - 从递归到迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21861445/

相关文章:

css - CSS 特异性的最佳实践?

c - 所有适当除数的总和

java - 只读 JFormattedTextField

php - PDOStatement::fetchAll() 太慢

java - 非 volatile 字段何时写入主存

java - 如何将 SOCKS 与 HtmlUnit 一起使用?

html - 静态定位会大大降低性能(?)

c++ - 为什么其中一个比另一个快得多?

java - 文件写入jar中的资源文件夹中

java - 数独类谜题的笼式约束