调试我的递归 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
和相同方法中的递归
if
和 continue
而不是 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(!)个不同的任务:
- 计算下一个斐波那契数
- 打印斐波那契数
- 限制您要查找的斐波纳契数的数量
有一个很好的原则:关注点分离。每个方法都应该准确地执行一个任务。
此外,如果您提到 recusrsion,可能您的意思是:
fibonacci(n) = fibonacci(n-1) + fibonacci(n-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);
}
}
}
我无法理解为什么输出错误。
我尝试编写一个打印斐波那契数列的递归代码,并得到了预期的输出和一系列意外值。
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
和相同方法中的递归if
和continue
而不是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(!)个不同的任务:
- 计算下一个斐波那契数
- 打印斐波那契数
- 限制您要查找的斐波纳契数的数量
有一个很好的原则:关注点分离。每个方法都应该准确地执行一个任务。
此外,如果您提到 recusrsion,可能您的意思是:
fibonacci(n) = fibonacci(n-1) + fibonacci(n-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);
}
}
}