递归到迭代(java)

时间:2016-09-08 10:21:10

标签: java recursion

作为编程的初学者我试图将以下递归方法转换为迭代方法,但我只是不了解它。方法或函数有一个二进制树,如递归,我想使用一个数组的迭代解决方案..不幸的是,我很困惑如何做到这一点。

我已经检查了将fibonnaci递归方法转换为迭代方法的方法。但我认为这不一样。另外我不确定树搜索方法是否有用?!任何帮助,提示,想法将不胜感激。感谢。

public static int funct(int n) {

  if (n == 0) return 1;
  if (n == 1) return 2;
  if n > 1 return funct(n-2)*funct(n/2);

}

2 个答案:

答案 0 :(得分:8)

因为如果你可以在列表中缓存所有成员,那么每个第n个成员都是由其他成员计算的。首先添加前两个已知成员。 Fibonacci更容易,因为你总是只需要以前的价值。

private static int func(int n) {
    List<Integer> values = new ArrayList<>(n+1);
    values.add(1);
    values.add(2);
    for (int i = 2; i <= n; i++) {
        values.add(values.get(i - 2) * values.get(i / 2));
    }

    return values.get(n);
}

答案 1 :(得分:2)

现在真正的功能是没有最后一次:

public static int funct(int n) {
    if (n == 0) return 1;
    if (n == 1) return 2;
    return funct(n-2) * funct(n/2);
}

由于递归调用引用较小的参数,因此可以将所有返回值缓存到n。

不幸的是,这已经破坏了乐趣,因为生成的代码已经完成了:

public static int funct(int n) {
    int[] results = new int[n+1];
    results[0] = 1;
    results[1] = 2;
    int i = 2;
    while (i <= n) {
        results[i] = results[i-2] * results[i/2];
        ++i;
    }
    return results[n];
}

它确实看起来像斐波那契。

一般来说,不需要填写results的所有项目。可能像results[n - 1]。 不幸的是,您应该在此问题之前学习:

  • 解决尾部递归问题。
  • 使用堆栈(如此处)使用重复呼叫的内部结果。

您可以查看这些主题。

数学后奏

初始值是2的幂。结果是早期结果的产品,所有结果都是2的幂。

f(0) = 1 = 2^0
f(1) = 2 = 2^1
f(n) = f(n - 2) * f(n / 2)

因此你可以介绍:

g(0) = 0
g(1) = 1
g(n) = g(n - 2) + g(n / 2)
f(n) = 2^g(n)

这将扩大您可以计算的范围,如 2 100

您还会看到:

g(2k + 1) = g(2k) + 1

所以你只需要一个偶数域:

g(2k) = g(2(k-1)) + g(k - k%2) + k%2