作为编程的初学者我试图将以下递归方法转换为迭代方法,但我只是不了解它。方法或函数有一个二进制树,如递归,我想使用一个数组的迭代解决方案..不幸的是,我很困惑如何做到这一点。
我已经检查了将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);
}
答案 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