递归到迭代(java)

递归到迭代(java),java,recursion,Java,Recursion,作为一名编程初学者,我正在尝试将下面的递归方法转换为迭代方法,但我不明白其中的诀窍。该方法或函数具有类似于二叉树的递归,我希望使用数组作为迭代解决方案。。不幸的是,我很困惑怎么做 我已经检查了将fibonnaci递归方法转换为迭代方法的方法。但我觉得这里不一样。我也不确定树搜索方法是否有用?!任何帮助、暗示、想法都将不胜感激。谢谢 public static int funct(int n) { if (n == 0) return 1; if (n == 1) return 2;

作为一名编程初学者,我正在尝试将下面的递归方法转换为迭代方法,但我不明白其中的诀窍。该方法或函数具有类似于二叉树的递归,我希望使用数组作为迭代解决方案。。不幸的是,我很困惑怎么做

我已经检查了将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);

}

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

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);
}
private static int func(int n){
列表值=新的ArrayList(n+1);
增加(1);
增加(2);

对于(int i=2;i现在,如果:

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];
}
因此,你可以介绍:

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

斐波那契还是二叉树?关于函数(n/2)的问题是什么?如果n是奇数怎么办?这是一个奇怪的函数,你有整数除法吗?@fge它似乎与答案在哪里有关
2^A242634(n)
这就是答案。我想用一个堆栈来使用一段时间,但你的解决方案看起来像是一个超级逻辑,你也应该在这段时间内增加Iloop@user1121883现在它好得多了。@joop只是错过了链接:)@维基百科中的JekinKalariya尾部递归对我来说不是很有说服力,stack或多或少就是我所做的。我们都知道,简单的数学将产生2个公式的幂函数
f(n)=2^{n-2+[(n-8):2].[(n-6):2]/2},给定n>5
1+2+3+…+k
(不确定我是否正确。)展示数学推导确实很好,但OP必须自己完成这项工作。@Joop:谢谢..那真的很棒..我非常喜欢你的实现!我肯定会看看上面提到的尾部递归和堆栈使用的主题。我也在考虑优化数组的大小。我不知道这是否有任何好处但是可以将长度设置为max(n-2,n/2)+1。你认为呢?
g(2k) = g(2(k-1)) + g(k - k%2) + k%2