我正在尝试提出一个程序,从用户那里获取任何数字,并为斐波那契代码生成第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();
}
答案 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);
}
与使用指数时间和内存的非尾递归版本相比,此版本将以线性时间运行并将使用恒定的内存量。