java - 如何最好地将递归函数转换为迭代函数?

标签 java recursion

此问题基于我在 compsci 类(class)中进行的测试。特别是,我正在努力转换此功能:

public static void foo(int number)  {
    if (number > 0) {
        foo(number / 2);
        System.out.print(number % 2);
    }
}

我需要将此函数转换为非递归函数,但我正在为此苦苦挣扎,因为 System.out.print(number % 2) 发生在递归调用之后。

最佳答案

当然,您始终可以模拟堆栈,但在很多情况下,您可以将其转换为完全无堆栈的解决方案。 (我不是 100% 确定,但我认为无堆栈转换仅适用于 primitive recursive functions 。我看不出没有某种堆栈可以计算类似 Ackermann function 的东西。)

无论如何,对于实践中的大多数情况(以及类里面的所有情况),都可以找到一种方法。在这里我们可以使用计数器技巧:

public static void foo(int number)  {
    for ( int divisor = 1; divisor <= number; divisor *= 2) {
      System.out.print( (number / divisor) % 2 );
    }
}

更新: 转换像这样的简单函数最简单实用的方法是运行它,记下每次迭代后的输出,然后完全忘记递归,忘记原始代码,单独看输出并问自己:这是什么代码在做什么?然后尝试编写产生相同输出的迭代代码。这种技术在大学时对我很有帮助。但它在现实生活中并不总是有效。 :)

关于java - 如何最好地将递归函数转换为迭代函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26682075/

相关文章:

java - JPA:从数据库获取数据而不是持久性上下文

java - 如何在 Struts 2 jQuery 饼图中设置自定义颜色

java - 为什么我无法使用表列设置 JTable

algorithm - 是否可以开发一种递归自动换行算法?

c - 如何使用递归函数遍历某个数字并提取小于 5 的数字?

java - Java中的多个生产者和消费者问题(没有BlockingQueue)

java - 如何获得按钮点击通知?

recursion - 原始递归与 "normal"递归有何不同?

Java hibernate/jpa 如何创建自相关的动态通用实体

java - 递归算法的java实现