Fibonacci序列不使用Array

时间:2014-11-07 18:19:56

标签: java fibonacci

我正在尝试通过编码Fibonacci序列来练习JAVA,其中用户可以声明从0到n的Fibonacci的长度。这是我的代码:

public class test {
public static void main(String args[]) throws IOException {
    BufferedReader pao = new BufferedReader(
            new InputStreamReader(System.in));

    System.out.print("Enter number: ");
    String enter = pao.readLine();
    int ent = Integer.parseInt(enter);

    int total1 = 0;
    int total2 = 1;
    int total3 = 0;

    for (int a = 0; a < ent; a++) {
        if (a <= 1) {
            System.out.print(" " + total3);
            total3 = total1 + total2;

        } else if (a == 2) {
            System.out.print(" " + total3);
        } else {
            total1 = total2;
            total2 = total3;
            total3 = total1 + total2;
            System.out.print(" " + total3);

        }
    }

}
}  

还有另一种方法可以做得更简单,更短,更好吗?&#34;办法?仍然没有使用数组。提前谢谢。

4 个答案:

答案 0 :(得分:1)

你可以使用递归的斐波纳契,但它会使你的运行时间从O(n)增加到O(2^n),就像下面的那样

int fib(int n) {
   if (n <= 1)
      return n;
   return fib(n-1) + fib(n-2);
}

还有另一种方法可以将运行时减少到O(log n),但它使用数组(使用矩阵{{1,1},{1,0}}的幂),你可以阅读它here。对于上面的递归,如果你使用数组,你可以通过方法调用动态编程再次将运行时改为O(n)

答案 1 :(得分:0)

使用递归:

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

答案 2 :(得分:0)

你的迭代解决方案很好(尽管如果这是一个代码审查,我会做其他的挑剔)。递归实现会赢得更多样式点,但它是substantially slower and more memory-intensive

对于最大样式点(*),您还可以使用Binet公式为斐波那契序列closed-form solution

(*)不要在生产代码中执行此操作,除非您真的,确实确定您需要它。

答案 3 :(得分:0)

public class Fibo {
    public static void main(String[] args) {
        int n = 12;
        int a = 0;
        int b = 1;

        System.out.print(a + " ");
        System.out.print(b + " ");
        for (int i = 0; i < n-2; i++) {
            int temp = a + b;
            a = b;
            b = temp;
            System.out.print(temp+" ");         
        }
    }
}