Java 使用arrayList实现一种高效的递归fibonacci算法

Java 使用arrayList实现一种高效的递归fibonacci算法,java,recursion,arraylist,fibonacci,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<Integ

我正在做一个赋值:一个递归的方法来确定斐波那契序列的第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    
  }
私有静态类Fib3实现Fibber
{
private ArrayList f=new ArrayList();
公共int fib(int n){
f、 加(0);
fiv(n);
返回f.get(f.size()-1);
}
私人国际金融中心(国际北){
如果(n==1 | | n==2){
f、 增加(1);
}
否则{
如果(n
}

在注释行中我将返回什么


谢谢

只要写一个简单的斐波那契就行了,就像没有列表一样。 然后添加列表部件:

  • 当您输入函数时,检查结果是否在列表中,如果在列表中则返回
  • 无论何时从函数返回,在返回前将结果存储到列表中
      你的回忆录有点太复杂了。当您声明并初始化
      f
      (请编程到
      列表
      界面,并且您可以使用菱形运算符
      )时,您可以添加两个初始值,如下所示

      private List<Integer> f = new ArrayList<>(Arrays.asList(0, 1));
      
      实际上,使用φ(φ)计算斐波那契数在实践中可以快得多;又名

    • 检查基本条件
    • 检查fib(n)是否在列表中。如果没有,请添加它
    • 返回fib.get(n)
    • 看起来这就是你想要完成的


      你是说代码真的很接近工作了。先把它处理掉,让事情变得混乱。另外,去掉那个helper函数,它也不需要。可以在工作后将其添加回。您的边缘条件应返回1。

      如果必须是“时间效率”,为什么要使用递归?似乎您要求我们编写整个升级。你试过什么?到目前为止你发现了什么?为什么在线资源对你没有帮助?寻找“动态规划”和/或“记忆”。@Jerfov2任务只是使用递归和迭代以及各种数据结构来完成相同的任务,我有其他变体,这正是我遇到的问题。实际最有效的一个是迭代和数组,这只是我必须完成的一个变体。它必须是arraylist吗?使用数组int[]或hashmap更有意义。明白了。我更仔细地看了看代码,现在我明白了你认为你在用备忘录做什么。我在第一次扫描时没有识别出它,因为您没有存储密钥(n的值)——因此,您无法随意恢复该值,我也没有。。。我是这么说的。埃利奥特发现并纠正了这个问题。我已经投票决定重新开始这个问题。好吧,我会尝试重写我的代码,就像我认为的那样,这不是为了让别人做家庭作业。谢谢!我看到这一点,意识到我用不必要的条件使递归语句过于复杂,并且我以错误的方式向arrayList添加了计算值。是的,这是一个很好的解决方案。@Nick这主要是OP的代码。我删除的比添加的多。@ElliottFrisch-Ya,这是一个很好的观点。如果可以的话,我会收回我的否决票。我重写了代码,去掉了一些条件。非常感谢。我的代码有效,而且更干净。
      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;
      }