我有一个递归函数,我需要转换为迭代函数,但我很困惑。任何人都可以帮助或指出我正确的方向吗?
f :: Int -> Int
f(0) = 5
f(1) = 8
f(2) = 3
f(n) = (f(n-3)) * (f(n-1))
干杯
答案 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