Fibonacci递归不起作用

时间:2018-01-13 03:40:10

标签: java recursion

我可能犯了一些愚蠢的错误,但每当我尝试运行这个程序时,总会给我一个错误的答案。例如,我问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);        
    }
}

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);
}