2015-12-03 143 views
2

最近我一直在寻找递归形式的数字(用户输入,正整数)的斐波那契和,例如(输出是): 9 = 8 + 1 14 = 13 + 1 30 = 21 + 8 + 1 等等。 到目前为止,我已经做了递归函数来计算实际的斐波那契数(在9总和,如8和1),它看起来像这样:斐波那契Sum in(Java)

static long[] f = new long[50]; 

static long fib(int n) { 
    if (n <= 1) { //base case 
     return 1; 
    } 
    if (n < f.length) { 
     if (f[n] != 0) { 
      return f[n]; 
     } 
     return f[n] = fib(n - 1) + fib(n - 2); 
    } 
    return fib(n - 1) + fib(n - 2); 
} 

我分配给我这是一个暗示:

提示: 重新定理为 n = fj +(n - fj) 这提示了一个递归解决方案。

,并用这一点,我已经目前想出这个:

static void fibSum(int n) 
{ 
    System.out.print(n + " = "); 
    for(int i = 0; i >= 0 ; i++) 
    { 
     if(n - (fib(i)) == 0) 
     { 
      System.out.println(fib(i)); 
     } 
     else if(n < (fib(i)) && n > (fib(i-1)))    
     { 
      System.out.println(fib(i-1) + " + "); 
     } 
    } 
} 

我的输出变为尽可能[进入例如,9作为用户输入]“9 = 8 +”,和与该对于所有正在阅读这些内容的人(并且感谢你获得这么多!),我的问题是为什么我没有得到分解总和中的最后一个数字(1),并且我的解决方案被认为是re​​curisve,因为它实际上并没有遵循我在过去的例子中看到的格式,也没有遵循我写的fib()方法。我不知道如何实现通过这种格式打印加号。 这里是我的参考主要方法:

public static void main(String[] args) { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Please enter an integer number: "); 
    int n = scan.nextInt(); 
    fibSum(n); 

回答

1

你似乎在你的函数fibSum各种问题:

  1. 你的循环没有结束。 (虽然我是积极的,但增加我)
  2. 您可以将:fib(i)存储在for循环中以避免多次计算。
  3. 您不处理您的if/else条件的每个案例。

例:

n = 2. 
fib(0) = 1 
if(2 - 1 == 0) => false 
if(2 < 1 && 2 > fib(-1)) => false && error. 
// Displays nothing. Should display: 2 = 1 + 1 
+0

我认为由于fib函数的基础case n <= 1,它处理诸如fib(-1)之类的情况并将其返回为1?也许我错了,目前正试图通过你提到的事来尝试找到并修复它们。 – Dan

0

使用while循环终于想通了,这一次。无论我尝试修复for循环多少次,我遇到了我的输出问题,所以我使用了一个布尔变量,并且一旦我达到n = 0时它就会变成false。