【问题标题】:Replacing recursion with iteration用迭代代替递归
【发布时间】:2015-03-12 11:42:25
【问题描述】:

我有一个递归函数,我需要将它转换为一个迭代函数,但我非常卡住。任何人都可以帮助或指出正确的方向吗?

f :: Int -> Int
f(0) = 5
f(1) = 8
f(2) = 3
f(n) = (f(n-3)) * (f(n-1))

干杯

【问题讨论】:

  • 以及为什么您认为您的帖子中需要 Java 标记?
  • 了解递归和动态规划之间的区别很重要。
  • @NeerajJain 抱歉,我现在将其删除

标签: algorithm recursion iteration


【解决方案1】:

下面的代码 sn-p 应该可以解决问题:

int output[1000];
output[0] = 5;
output[1] = 8;
output[2] = 3;

for (int i=3; i < 1000; ++i) {
    output[i] = output[i-3] * output[i-1];
}

奖励:以这种方式以非递归方式实现您的函数称为动态编程。

【讨论】:

  • 谢谢你,但我正在寻找一种适用于所有 n>0 的方法?
  • 实际上是的,如果我将 1000 替换为 n 它应该可以工作。谢谢,我现在会接受你的回答
  • 这只是将堆栈滚动到一个数组中 - 除了它使用堆而不是堆栈之外,它本质上与递归解决方案的功能相同。
  • @OldCurmudgeon 我不同意你的观点。对于 N=1000,递归解决方案将涉及 更多 个函数调用。我的解决方案只涉及 1000 次迭代。
  • @TimBiegeleisen - 这是一个很好的观点 - 它也使用 1000 个整数。你是Memoizing前n个解决方案。
【解决方案2】:

这看起来有效。本质上,它会保留最近的 3 个数字并将它们向上移动,直到我们点击 n。

public int rf(int n) {
    return n == 0 ? 5
            : n == 1 ? 8
                    : n == 2 ? 3
                            : rf(n - 3) * rf(n - 1);
}

public int nrf(int n) {
    int[] v = {5, 8, 3};
    int x = n == 0 ? 5
            : n == 1 ? 8
                    : n == 2 ? 3
                            : 0;
    for (int i = 2; i < n; i++) {
        x = v[0] * v[2];
        v[0] = v[1];
        v[1] = v[2];
        v[2] = x;
    }
    return x;
}

public void test() {
    for (int i = 0; i < 10; i++) {
        System.out.println(rf(i) + " = " + nrf(i));
    }
}

正确打印:

5 = 5
8 = 8
3 = 3
15 = 15
120 = 120
360 = 360
5400 = 5400
648000 = 648000
233280000 = 233280000
1286582272 = 1286582272

【讨论】:

  • 感谢您的回答,但 tim 的回答更简单,并且可以扩展到任何功能。
  • @kabeerv - Tim 的解决方案可能对较大的 n 非常耗内存。我基本上也是这样做的,但我只保留了他可能巨大的数组的最后三个条目,所以我对内存完全不敏感。
  • @kabeerv - 这也可以扩展到任何功能 - 这里实现的功能使用 x = v[0] * v[2]; 编码,相当于您的 rf(n - 3) * rf(n - 1)。
  • 我不是有意冒犯,我感谢您的帮助并支持答案,但我只是想知道做这样的事情背后的概念,并且 tim 的解决方案似乎适用于任何情况,而无需付出太多努力我在找什么。再次感谢您的回答
  • @kabeerv - 没有冒犯 - 只是确保您明白这比递归解决方案或将堆栈拉入堆中的解决方案要脆弱得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2019-12-10
  • 2011-11-14
  • 2012-04-26
  • 2012-01-23
  • 2021-11-09
  • 1970-01-01
相关资源
最近更新 更多