Java Fibonacci递归代码

时间:2014-11-11 21:20:20

标签: java fibonacci

我正在尝试提出一个程序,从用户那里获取任何数字,并为斐波那契代码生成第n个数字。当我完成我的工作时,它会显示下一个#而不是#I需要。例如,我正在寻找第11个#并且它正在生成233而不是144.这是我的代码:

public static int fibonacci(int n)
{
    if (n<=0)
        return 1;
    else
        return fibonacci(n-2)+ fibonacci(n-1);
}


public static void main(String[] args)
{
    System.out.println("Enter a Number:");
    Scanner keyboard = new Scanner(System.in);
    int number = keyboard.nextInt();
    System.out.println("You Entered Number:" + number);
    System.out.println(number + "th Fibonacci Number is:"+ fibonacci(number));
    keyboard.close();        
}

3 个答案:

答案 0 :(得分:5)

应该是

if(n == 0)
    return 0;
else if(n == 1)
    return 1;
else
    return fibonacci(n - 1) + fibonacci(n - 2);

因为fibonacci(0)= 0

答案 1 :(得分:2)

您缺少索引。 您正在打印下一个斐波那契数字。

(n<=0)

(n<=1)

编辑:

正如另一个答案所说,fib(0)= 0,所以你也必须添加这个边缘情况。

答案 2 :(得分:0)

亚历山大已经给了你答案,但我认为有必要警告你,你的代码效率极低。实际上,对于计算fibo(4),您将计算fibo(3)fibo(2)fibo(3)需要计算fibo(2)fibo(1)等等。最后,您将花费大量时间计算已计算的结果(并且您将使用指数量的内存来存储本地递归调用上下文)。

对于更高效的代码,您需要实现迭代或尾递归方法。尾递归方法meth是递归调用的形式为meth(f(args))的方法。在您的情况下,您的递归调用具有f(meth,args)形式,因此它不是尾递归。

这是一个尾递归版本:

public static int fibonacci(int n) {
    if (n == 0)
        return 0;
    else if (n <= 2)
        return 1;
    else 
        return fibonacciAux(0,1,n);
}

public static int fibonacciAux(int a, int b, int n) {
    if (count == 0)
        return b;
    else  
        return fibonacciAux(b,a + b,n - 1);
}

与使用指数时间和内存的非尾递归版本相比,此版本将以线性时间运行并将使用恒定的内存量。