我正在尝试通过编码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;办法?仍然没有使用数组。提前谢谢。
答案 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+" ");
}
}
}