递归斐波那契数字程序

时间:2016-01-01 14:29:31

标签: recursion

我已经编写了程序来打印斐波纳契数字,达到用户想要的极限。我以递归的方式编写了该程序,它应该按预期输出。它提供了正确的输出,但附加了错误的值。如果用户想要打印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);
        }

    }
}

1 个答案:

答案 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)调用因为它们不打印任何东西):

Too many recursive calls and unneeded loop

如果你把它全部加起来,你可以看到该程序完全打印了31个斐波那契数字,这太多了,因为你只想打印5个!这个问题是由同时使用while和recursive调用引起的。您希望递归行为与此类似,没有while循环:

Right amount recursive calls, no loop

或者你想要一个while循环而不是递归:

No recursion, while loop