调试我的递归 Fibonacci Java 代码并更正逻辑

Debugging my recursive Fibonacci Java code and correcting the logic

我无法理解为什么输出错误。

我尝试编写一个打印斐波那契数列的递归代码,并得到了预期的输出和一系列意外值。

public class FibonacciSeries {

    static int limitNum = 10;  //the desired number of Fibonacci values

    public static void main(String[] args) {
        FibonacciSeries series = new FibonacciSeries();
        series.printRecursiveFibonacci(0,1,1);
    }

    public void printRecursiveFibonacci(int a, int b, int count)
    {
        while(count<=limitNum)
        {
          if(count==1||count==2)
          {
            System.out.println(count-1);
            count++;
            continue;
          }

        int k=a+b;
        a=b;
        b=k;
        System.out.println(b);
        count++;
        printRecursiveFibonacci(a, b, count);   
        }
    }

}

预期的输出是 0 1个 1个 2个 3个 5个 8个 13 21 34

但我得到了 - 0 1个 1个 2个 3个 5个 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 5个 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 3个 5个 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 5个 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 2个 3个 5个 8个 13 21 34 34 21 34 34 13 21 34 34 21 34 34 8个 13 21 34 34 21 34 34 13 21 ...

我不确定你的代码到底发生了什么,发生了很多奇怪的事情:

  • while 和相同方法中的递归
  • ifcontinue 而不是 if/else
  • 有时打印 count - 1,其他时候 b

我怀疑这与您的循环没有按预期终止有关。通常,尝试坚持使用递归 循环。这是一个示例实现:

public static void printFibLimit(int a, int b, int count) {
    if (count >= EXTERNALLY_DEFINED_LIMIT_VARIABLE) return;  // if true, we're done, no more work has to be done. 
// Since this is a tail-recursive function, return will terminate the function

    System.out.println(a);  // print our first value

    printFibLimit(b, a + b, count + 1);
    // a -> b
    // b -> a + b
    // count -> count + 1

}

问题是您在一个方法中混合了 3(!)个不同的任务:

  1. 计算下一个斐波那契数
  2. 打印斐波那契数
  3. 限制您要查找的斐波纳契数的数量

有一个很好的原则:关注点分离。每个方法都应该准确地执行一个任务。

此外,如果您提到 recusrsion,可能您的意思是:

fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)

拆分你的方法:

  1. 在一种方法中,只保留计算下一个斐波那契数。
  2. 在另一种方法中组织一个循环并打印。

这是一个可能的解决方案:

public class Fibonacci {

    private static final int LIMIT = 10;

    private static int fibonacci(int n) {
        if (n == 1) {
            // The 1st Fibonacci number is 0
            return 0;
        }

        if (n == 2) {
            // The 2nd Fibonacci number is 1
            return 1;
        }

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

    public static void main(String[] args) {
        for (int i = 1; i <= LIMIT; i++) {
            int fibo = fibonacci(i);
            System.out.println(fibo);
        }
    }
}