我正在进行一项任务:一种递归方法,用于确定斐波纳契数列的第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
}
}
我会在注释行中返回什么内容?
由于
答案 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.