显示斐波那契数的算术?

时间:2015-03-31 20:11:45

标签: java algorithm fibonacci

import static java.lang.System.*;

class NA_False {
public static void main(String[] args) {
    int fibonacci = fibo(5);
    System.out.println(fibonacci);
}
static int fibo(int n) {
    if (n == 0 || n == 1) {
        out.println(n);
        return n;
    }
    else {
        int n1 = fibo(n - 1);
        int n2 = fibo(n - 2);
        out.println((n1 + n2) + "=" + n1 + "+" + n2);
        return n1 + n2;
    }
}
}

我想说明我们如何得到每个斐波纳契数,但我得到了太多不必要的步骤。

3 个答案:

答案 0 :(得分:1)

使用递归非常简单 -

public static int fibo(int n){
        if(n == 1 || n == 2){
            return 1;
        }

        return fibo(n-1) + fibo(n -2); 
}  

现在从您的主要方法中,您可以将其称为打印 -

int fibonacci = fibo(5);
System.out.println(fibonacci);

更新当您需要一步一步的结果时,您可以使用以下解决方案使用for循环 -

public class FiboTest{

     public static void main(String[] args){

          int term = fibo(17);
          //1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
          System.out.println();
          System.out.println("Result: " +term);
     }

     public static int fibo(int n){

          int first = 1;
          int second = 1;
          int third = 0; 
          for(int i=1; i<(n-1); i++){

               third = first+second;
               System.out.println(first +" + "+ second  +" = "+ third);

               //update first and second terms 
               first = second;
               second = third;
          }

          return third;
     }  
}

答案 1 :(得分:0)

问题在于这可能是计算斐波那契数的最差方法。原因是,为什么你多次看到大多数加法是因为你多次对它们进行计算。
通常你会从第1和第2个纤维开始,然后按顺序前进,直到达到所需的数字。

答案 2 :(得分:0)

当您递归计算fibo(n)时,它会为每个调用打开两个分支。例如,如果我们执行fibo(5),则确实如此:

fibo(5) = fibo(4) + fibo(3)

然后它需要计算fibo(4),所以它确实:

fibo(4) = fibo(3) + fibo(2)

如您所见,fibo(3)被调用两次。这就是为什么你会两次打印2=1+1的原因。对于fibo(2)fibo(1)

,这也会多次发生

如果您只打印一次总和,则需要存储已计算的值或使用其他方法计算斐波纳契数。

您可以使用for循环迭代地执行此操作:

static int fibo(int n) {
    int p1 = 0;
    int p2 = 1;
    for (int i = 0; i < n; i++) {
        int tmp = p1 + p2;
        System.out.println(tmp + "=" + p1 + "+" + p2);
        p1 = p2;
        p2 = tmp;
    }
    return p2;
}

请注意,这将以1 1 2 3...的形式返回序列。如果您需要表单0 1 1 2 3...,则需要将return p2替换为return p1