2015-03-31 50 views
1
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; 
    } 
} 
} 

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

+1

[看这里](http://imagizer.imageshack.us/a/img440/2996/tu2.png) – 2015-03-31 20:12:39

回答

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; 
    } 
} 
+0

我认为目标不是仅仅显示结果,而是要显示递归计算的每一步。 – tomse 2015-03-31 20:28:07

+0

我想打印每个数字如何加在一起,例如我想打印8 = 5 + 3。 – TheJuggler 2015-03-31 20:30:05

0

问题是这可能是计算斐波纳契数的最糟糕的方法。原因是,为什么你多次看到最多的添加,因为你多次调整它们。
通常情况下,您将从fib编号1和2开始,然后继续处理序列,直至达到所需的编号。

0

递归计算fibo(n)时,它会为每个调用打开两个分支。如果我们这样做fibo(5),例如,它的作用:

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

然后它需要calulcate fibo(4),它确实是这样:

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

正如你所看到的,fibo(3)被调用了两次。这就是为什么你会打印两次2=1+1。这也将发生多次为fibo(2)fibo(1)

如果你要打印的每个总和只有一次,你将需要存储你已经计算出的值,或使用不同的方法来计算Fibonacci数。

您可以用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 p1替换return p2