我可能犯了一些愚蠢的错误,但每当我尝试运行这个程序时,总会给我一个错误的答案。例如,我问Fibonacci序列的第5个值是什么,它说7。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
int n=0;
try{
n= Integer.parseInt(jTextField1.getText());
}
catch(NumberFormatException e){
jTextField2.setText("Please enter valid integers.");
}
jTextField2.setText("Fibo value is"+Fibonacci(n));
}
private int Fibonacci(int n){
System.out.println(n+"N");
if (n <=1) {
return n;
}
else{
return Fibonacci(n-1)+(n-2);
}
}
答案 0 :(得分:4)
Fib递归地定义为cardView.frame.origin.y = originalY + offSetY
。
您的计划将其定义为Fib(n) = Fib(n-1) + Fib(n-2)
答案:
Fib(n) = Fib(n-1) + (n-2)
答案 1 :(得分:2)
您正试图通过二进制递归找到Fibonacci。你应该进行两次递归调用,比如
return Fibonacci(n - 1) + Fibonacci(n - 2);
但你在这里犯了一个错误 -
return Fibonacci(n - 1) + (n - 2);
您的代码可以通过
轻松修复int Fibonacci(int n) {
if (n <= 1)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
上面的递归称为二进制递归,因为它进行两次递归调用而不是一次。 让我们计算计算第k个Fibonacci数所需的调用次数: - 设nk表示执行中执行的调用次数。
n0 = 1
n1 = 1
n2 = n1 + n0 + 1 = 3> 21个
n3 = n2 + n1 + 1 = 5> 22个
n4 = n3 + n2 + 1 = 9> 23个
n5 = n4 + n3 + 1 = 15> 23 ...
nk&gt; 2k / 2
这意味着Fibonacci递归在k中进行了许多指数调用 换句话说,使用二进制递归来计算Fibonacci数是非常低效的。
这种线性递归版本需要进行O(n)次调用。
更有效的解决方案: -
int fibonacci(int n) {
return fibonacciSlave(0, 1, n);
}
int fibonacciSlave(int a, int b, int n) {
if(n <= 1) {
return b;
}
return fibonacciSlave(b, a+b, n-1);
}