2013-04-18 116 views
1

我想用递归打印斐波那契数列,我的代码没有结束递归。你能告诉我,如果我错过了something.I认为第二递归进入无限循环,以及为什么它正在发生在递归中打印斐波那契数列

class Main 
{ 
    public static void main (String[] args) 
    { 
     int k=7; 
     int x=0,y=1; 
     fib(x,y,k,0); 
     return; 

    } 

    public static void fib(int x,int y,int k,int cnt) 
    { 
     int z; 
     if(cnt>k) 
     return; 

     if(cnt<=k) 
     { 
      z=x+y; 
      x=y; 
      y=z; 
      System.out.println("value is"+z); 

      fib(x,y,k,cnt++); 

     } 

    } 
} 
+0

如果您试图学习递归,那么您应该考虑下面概述的方法Imran。你所拥有的解决方案虽然在技术上是递归的,但并不是真正的“自然”递归解决方案(它是“尾递归”,因此将其改为非递归for循环很简单)。伊姆兰解决方案背后的想法是斐波那契数的(通用)定义本身是递归的(它在定义中使用斐波那契数)。一个自然的递归解决方案将利用这一点。因此,“fib(n)= fib(n-1)+ fib(n-2)”是定义...并且也是(伪)代码。 – rliu 2013-04-18 05:24:15

回答

1

这个问题我不能够搞清楚的是在 -Increment:

fib(x,y,k,cnt++); 

此传递的cnt原始值的递归调用,而然后增量它。

如果在fib()的开头打印cnt的值,则会看到它始终为零。

一个简单的解决方法是该呼叫改变

fib(x,y,k,cnt+1); 

而且,你的斐波那契数的编号是有点奇怪(我想说的是,第七号是8,你的代码认为这是34)。

最后,我可能值得注意的是第二个if是不必要的。

+0

谢谢..我会尝试 – 2013-04-18 15:01:09

1

你似乎并不理解斐波那契数的概念。请阅读wikipedia article。以下是该功能的代码。

public static int fib(int n) 
{ 
    if(n == 0 || n == 1) 
     return n; 

    return fib(n-1) + fib(n-2); 
} 
+0

你可以在函数的最后一行之前打印数字来打印系列。 – 2013-04-18 05:07:50

+1

我不同意上面的评论 – bearMountain 2013-09-27 15:52:16

+0

@Imran S不应该这样返回1而不是返回n吗? – user2441441 2014-01-30 20:08:09