使用arrayList制作一个节省时间的递归fibonaccci算法

时间:2017-03-28 02:07:08

标签: java recursion arraylist fibonacci

我正在进行一项任务:一种递归方法,用于确定斐波纳契数列的第n个值。通过使用arrayList存储计算值,该方法应该更加节省时间,每次我需要使用先前计算的值(例如n-1,n-2)时,它会从arrayList中提取值,O(1)访问。

我无法弄清楚创建并将新值存储到arrayList的递归段。

private static class Fib3 implements Fibber
{
  private ArrayList<Integer> f = new ArrayList<Integer>();

  public int fib(int n){
     f.add(0);
     fiv(n);
     return f.get(f.size()-1);
  }
  private int fiv(int n){
     if(n == 1 || n == 2){
        f.add(1);
     }
     else{
        if(n < f.size()){
           return f.get(n);
        }
        else{
           f.add(fiv(n-1) + fiv(n-2));
           //return something here
        }
     } 
     //or here    
  }

}

我会在注释行中返回什么内容?

由于

3 个答案:

答案 0 :(得分:2)

你的记忆有点过于复杂。当您声明并初始化f(并请编入List界面,并且您可以使用钻石操作员<>)时,您可以添加两个初始值,例如

private List<Integer> f = new ArrayList<>(Arrays.asList(0, 1));

然后fib可以检查f中的号码是否已经可用(如果是,则返回它),否则计算下一个值并存储然后返回它(fiv正在做所有的工作,但我认为fib应该是)。像,

public int fib(int n) {
    if (n < f.size()) {
        return f.get(n);
    }
    int v = fib(n - 2) + fib(n - 1);
    f.add(n, v);
    return v;
}

实际上,使用φ(phi)可以更快地计算Fibonacci数;又名Golden ratio

答案 1 :(得分:0)

只要在没有List的情况下写一个普通的Fibonacci。 然后添加List部分:

  • 当您输入功能时,检查结果是否在列表中,如果是,则返回。
  • 每当从函数返回时,都会在返回之前将结果存储到列表中。

答案 2 :(得分:0)

  1. 检查基本情况
  2. 检查fib(n)是否在列表中。如果没有,请添加它。
  3. return fib.get(n)
  4. 看起来这就是你想要完成的事情。

    你的代码真的很接近工作。首先摆脱它,让事情变得混乱。此外,摆脱辅助功能,也不需要。一旦它正常工作,可以稍后再添加。您的边缘条件应该返回1.