Java 使用arrayList实现一种高效的递归fibonacci算法
我正在做一个赋值:一个递归的方法来确定斐波那契序列的第n个值。通过使用arrayList存储计算值,该方法应该更具时间效率,每次我需要使用以前计算的值(例如n-1、n-2),它都会从arrayList中提取值,并具有O(1)访问权限 我不太清楚创建和存储arrayList新值的递归段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
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;
}