如何在此Fibonacci系列代码中打印5个术语后停止递归?

时间:2017-03-10 23:55:55

标签: java recursion

class FibR
{
   int c=0;
   void fib(int i,int j,int n){
     if(c==n) return;
     System.out.print(i+" "+j+" ");
     int t=j;
     i=i+j;
     j=i+t;
     c++;
     fib(i,j,n);     
   }

   public static void main(String[] args) {
       FibR f=new FibR();
       f.fib(0,1,5);
    }
}

输出结果为:

0 1 1 2 3 5 8 13 21 34

我只需要打印0 1 1 2 3 ,i.e,5个术语 if语句中的条件需要哪些更正?尝试c+=2而不是c++,但代码进入无限循环。 提前致谢

6 个答案:

答案 0 :(得分:6)

在每次fib来电中,您都会打印两个原始数字:System.out.print(i+" "+j+" ");

以下是一个更简单的版本:

public class FibR {
void fib(int i, int j, int n) {
    if (n == 0) return;
    System.out.println(i);
    fib(j, i + j, n - 1);
}

public static void main(String[] args) {
    FibR f = new FibR();
    f.fib(0, 1, 5);
}
}

每次拨打fib时,都会传递最新的两个号码(ij)以及剩余的号码(n)。

答案 1 :(得分:4)

要使用c += 2,您还应在if-statement中包含相等内容。

class FibR
{
   int c = 0 ;
   void fib(int i, int j, int n){
     if (c >= n) return;
     System.out.print(i+" " + j +" ");
     int t = j;
     i += j;
     j = i + t;
     c += 2;
     fib(i, j, n);     
   }

   public static void main(String[] args) {
       FibR f = new FibR();
       f.fib(0, 1, 5);
       System.out.println();
    }
}

由于您不能只获得5个字符,因此输出将为:

0 1 1 2 3 5

答案 2 :(得分:3)

当您同时打印ij时,您无法打印5个字词。它可以是4或6。

现在,就无限循环而言,如果您要将c++更改为c+=2,则需要将if (c == n)更改为if (c >= n)c第二次迭代后将大于5。

答案 3 :(得分:2)

将计数器减少到3,如果你的迭代达到计数器-1,只需打印i并删除j

class FibR {
    int c = 0;

    void fib(int i, int j, int n) {
        if (c == n) return;
        if (c < n - 1)
            System.out.print(i + " " + j + " ");
        else
            System.out.print(i);//c == n-1 => just print i

        int t = j;i = i + j;j = i + t;c++;fib(i, j, n);
    }

    public static void main(String[] args) {
        FibR f = new FibR();
        f.fib(0, 1, 3);//reduce to 3
    }
}

答案 4 :(得分:0)

为什么要这样写你的功能?由于它是递归,因此您的函数应该只接受一个参数,即您想要的元素数量。

似乎你使用3个参数使它变得复杂。

答案 5 :(得分:0)

在递归函数中,您最好不要保存/取决于某些外部状态/文件。在您的示例代码中,它是因为您在每次调用中打印两个术语,因此您永远不会让它打印奇数。