【问题标题】:recursive to iterative (java)递归到迭代(java)
【发布时间】:2016-09-08 10:21:09
【问题描述】:

作为一名编程初学者,我正在尝试将以下递归方法转换为迭代方法,但我就是没有掌握它的窍门。该方法或函数有一个像递归这样的二叉树,我想使用一个数组作为迭代解决方案。不幸的是,我很困惑如何去做。

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

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);

}

【问题讨论】:

  • 斐波那契或二叉树?问题是什么?
  • 功能(n/2)?如果 n 是奇数怎么办?这是你在这里有一个奇怪的功能
  • 整数除法?
  • @fge 似乎与A242634 相关,答案是2^A242634(n)

标签: java recursion


【解决方案1】:

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

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);
}

【讨论】:

  • 这就是答案。
  • 我在想用一段时间和堆栈,但你的看起来更好
  • 超级逻辑的超级解决方案
【解决方案2】:

现在真正的函数没有last if:

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)

这将扩大您可以计算的范围,例如 2100

你还会看到:

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

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

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

【讨论】:

  • 你还应该在 while 循环中增加 i
  • @user1121883 现在好多了。
  • @joop 只是错过了链接 :)
  • @JekinKalariya 维基百科中的尾递归对我来说不是很令人信服,堆栈或多或少是我所做的。我们都知道简单的数学运算会产生 2 公式的幂 f(n) = 2^{n-2 + [(n-8):2].[(n-6):2] / 2} given n &gt; 5 整数除法和总和 1+2+3+...+k。 (不确定我是否做对了。)展示数学推导确实很好,但 OP 必须自己完成这项工作。
  • @Joop:谢谢.. 这真的很棒.. 我非常喜欢你的实现!我一定会看看提到的尾递归和堆栈使用的主题。我也在考虑优化数组的大小。我不知道这是否有任何好处,但可以将长度设置为 max(n-2, n/2) + 1。你怎么看?
猜你喜欢
  • 2012-08-29
  • 2022-01-16
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2018-06-19
  • 2016-01-05
  • 2013-12-31
相关资源
最近更新 更多