用迭代替换递归

时间:2015-03-12 11:42:25

标签: algorithm recursion iteration

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

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

干杯

2 个答案:

答案 0 :(得分:2)

以下代码段应该可以解决问题:

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

奖励:以这种方式非递归地实现您的功能称为动态编程

答案 1 :(得分: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