Java 递归Fibonocci生成

Java 递归Fibonocci生成,java,recursion,fibonacci,Java,Recursion,Fibonacci,我正在尝试创建一个方法,该方法将根据用户输入生成斐波那契序列,并通过递归计算到第十个数字。(现在学习递归,这是一个练习) 以下是我尝试的代码,我目前正在努力使其生效: //being run with fibonacci(10, 10); //Start being the number the sequence starts with public static int fibonacci(int start, int times) { if(times > 0) {

我正在尝试创建一个方法,该方法将根据用户输入生成斐波那契序列,并通过递归计算到第十个数字。(现在学习递归,这是一个练习)

以下是我尝试的代码,我目前正在努力使其生效:

//being run with fibonacci(10, 10);
//Start being the number the sequence starts with
public static int fibonacci(int start, int times) 
{
    if(times > 0)
    {
        int result = fibonacci(start - 1, times - 1) + fibonacci(start - 2, times - 1);
        sequence += result;
        return result;
    }
    System.out.println(sequence);
    return start;
}
但是,这会返回大量数据(我认为大约40000个数字大约需要10秒才能运行完成)。而且所有的数字似乎都是负数,绝对不是我的目标

现在,关于识别问题:我相信问题在于,每次调用该方法时,该方法都会多调用两次自身,加起来就相当大了。然而,我想不出一种方法来解决这个问题,因为我每次都试图通过递归来实现,我别无选择,只能再次调用它

至于为什么是否定的,我一点也不知道。我原以为我正确地使用了斐波那契方程,但很明显我做得不对

有人能帮我解决这个问题吗


(没错,我可以很容易地用谷歌搜索一些代码,因为我确信它确实存在,但我想真正了解这是如何做到的,以及我做错了什么,以供将来参考。作为一名程序员,最好是从复制的代码中获得分数,然后继续前进)

我想你对斐波那契序列有点困惑。公式为F(n)=F(n-1)+F(n-2)。递归应该总是在一个基本情况下结束,对于斐波那契来说,这个基本情况是F(0)=0,F(1)=1。您的方法只需要一个n变量

这样想:

public static int fibonacci(int n) {
  //Insert your base cases here to terminate early
  //Then process the recursive formula
  return fibonacci(n - 1) + fibonacci(n - 2);
}

我想我明白你想做什么。从一开始你需要10个斐波那契数。也许这样的方法会奏效:

public static int[] fibonacci(int start, int times) 
{
    return fibonacci(start, times, 0, 1, new int[times]);
}

private static int[] fibonacci(int start, int times, int a, int b, int[] answer) 
{    
    if( start > 0 )
        return fibonacci(start-1, times, b, a+b, answer);

    if( times > 0 )
    {
        answer[answer.length - times] = a;
        return fibonacci(start, times-1, b, a+b, answer);
    }

    return answer;
}

public static void main(String[] args) {
    int[] a = fibonacci(5, 10);

    for(int i=0; i<a.length; i++)
    {
        System.out.println(a[i]);
    }
}
公共静态int[]斐波那契(int开始,int次)
{
返回斐波那契(开始,时间,0,1,新整数[时间]);
}
私有静态int[]fibonacci(int start,int times,int a,int b,int[]answer)
{    
如果(开始>0)
返回斐波那契(开始-1,时间,b,a+b,答案);
如果(次数>0)
{
答案[答案.长度-次数]=a;
返回斐波那契(开始,乘以-1,b,a+b,答案);
}
返回答案;
}
公共静态void main(字符串[]args){
int[]a=斐波那契(5,10);

对于(inti=0;iHint:为什么需要时间和开始。在递归中,你会递归,直到你遇到一个不再需要的“基本情况”——在斐波那契中,这些基本情况是0和1。为什么是负的?想想这部分
fibonacci(开始-2,时间-1)
。如果
start=10
times=10
第一次调用是
fibonacci(8,9)
下一次调用是
fibonacci(6,8)
…根据您的条件
times>0
最后一次调用将是
fibonacci(-6,2)
或者
fibonacci(-8,1)
享受它的乐趣。当你让它工作时,为前40个数字计时,然后是41、42,…大约46个数字。执行时间从大约10分钟跳到足以耗尽我的耐心,这可能需要几个小时。看着代码,我想我理解你是如何想出这个解决方案的。非常感谢你让我盯着代码看了好一阵子,但我想我现在明白了。