我已经编写了程序来打印斐波纳契数字,达到用户想要的极限。我以递归的方式编写了该程序,它应该按预期输出。它提供了正确的输出,但附加了错误的值。如果用户想要打印4个或超过4个斐波纳契数,就会发生这种情况。同样在递归函数中,我在将函数调用传递给同一函数之前减少了计数值。如果我减少被调用函数参数中的计数值,则while循环无休止地运行。当循环在一些步骤完成并且用户限制输入为5之后,输出为
输入限制数....
5
斐波纳契数是:0 1 1 2 3 3 2 3 3
成品.........
任何人都可以告诉我程序中的错误或输出背后的确切原因。提前感谢。
计划如下:
public class FibonacciNumbers
{
public static void main(String[] args)
{
int i=0, j=1;
Scanner sc = new Scanner(System.in);
System.out.println("Enter the limit number....");
int num = sc.nextInt();
System.out.print("Fibonacci numbers are: " + i + " " + j + " " );
fibonacci(num-2, i, j);
System.out.println("\nFinished.........");
}
public static void fibonacci(int count, int i, int j)
{
int sum = 0;
while(count > 0)
{
sum = i+j;
i=j;
j=sum;
System.out.print(sum + " ");
--count;
fibonacci(count, i, j);
}
}
}
答案 0 :(得分:2)
您不需要while循环和递归函数调用。您必须在使用循环或递归调用之间进行选择。
递归解决方案:
public static void fibonacci(int count, int i, int j) {
if (count>0){
int sum = i+j;
i=j;
j=sum;
System.out.print(sum + " ");
--count;
fibonacci(count, i, j);
}
}
涉及循环的解决方案:
public static void fibonacci(int count, int i, int j) {
int sum = 0;
while(count > 0) {
sum = i+j;
i=j;
j=sum;
System.out.print(sum + " ");
--count;
}
}
如果仔细查看代码的以下输出,可以看到在输出的开头有实际的7个第一个斐波纳契数,之后出现了一系列相同的斐波纳契数。你从main打印了两个数字,然后你预计还有5个数字,但得到31:
输入限制号码.... 7
斐波纳契数是:0 1 1 2 3 5 8 8 5 8 8 3 5 8 8 5 8 8 2 3 5 8 8 5 8 8 3 5 8 8 5 8 8
这是因为当你第一次使用count=5
调用斐波纳契函数时,while循环有5次迭代,因此它打印出5个斐波纳契数,并且使用这些计数参数从那里调用5次斐波纳契函数:{{ 1}}。当使用参数4,3,2,1,0
调用fibonacci函数时,它会打印4个数字并使用以下参数调用斐波那契4次:count=4
因为while循环有4次迭代。我画了一个递归调用的图像(我省略了f(0)调用因为它们不打印任何东西):
如果你把它全部加起来,你可以看到该程序完全打印了31个斐波那契数字,这太多了,因为你只想打印5个!这个问题是由同时使用while和recursive调用引起的。您希望递归行为与此类似,没有while循环:
或者你想要一个while循环而不是递归: