2013-04-10 76 views
0
public class recursion { 

    public static void main(String[] args) 

    { 
     thisclass(0); 
    } 

    public static void thisclass(int z) 
    { 
     int x = 1; 
     int y = 3; 
     if (z==10) 
     { 
      System.out.println("Done"); 
     } 
     else 
     { 
      System.out.println(x/y); 
      x++; 
      y= y+2; 
      thisclass(z++); 
     } 
    } 

} 

我学习递归现在,当我到达的thisclass方法else语句,我得到一个错误,它打印零的异常量之后。学习递归调用错误,当类

我希望程序做的就是运行10次,做沿着打印1/3 2/5 3/7线的东西是什么等

我在哪里去了?

+0

仅供参考,“thisclass”是一种方法,而不是一类,这是非常令人困惑。 .. – sashkello 2013-04-10 01:47:54

回答

3

有,据我可以告诉(除命名约定)三件事情是造成你的程序,其意不运行。 (1)您正在打印中进行整数除法,所以1/3将为0(整数中不包含小数)。

解决方案:将int xint y更改为double xdouble y。 (2)当你将它传递给递归调用时,你会增加z,这意味着递归调用不会看到新值,而是旧值。

解决方法:预增量z thisclass(++z)。 (3)你也可能意味着你的方法之外声明了xy,以便它们的更新值保持不变。 (相反,您只需要打印相同的值10次)。

解决方案:

double x = 1.0; 
double y = 3.0; 
public static void thisclass(int z){ ... 
+0

谢谢大家的回应,感觉就像一个facepalm时刻,我应该知道这些事情。 – popcornhappy 2013-04-10 01:56:36

2

你得到所有这些0的,因为你正在做的integer division,它不支持1/3

你应该改变你的代码中使用float的,这将摆脱0问题。

E.g.

float x = 1.0; 
float y = 3.0; 

你也与每个呼叫的复位y的价值,所以y永远是3在通话和5在结束的开始。您应该检查z的值以查看y的值应该是多少。

x的值也可以这么说。

z正在post-incremented在每次调用,这将导致z价值不是每次调用增加,你应该调用更改为:

thisclass(++z); 

为了让塔值pre-incremented。否则这个电话会永远持续下去。

此外,请不要打电话给您的方法thisclass是非常混乱。

4

这条线:

thisclass(z++); 

没有做什么,你认为它。它增加'z',然后在z的原始值上调用这个类。这就像做了很多:

int temp = z; 
z = z + 1; 
thisclass(temp); 

您想在这里使用前增量,而不是后增的:

thisclass(++z); 

是drunkenRabbit和Serdalis已经发布的答案也是有效的。只有在完成所有这些更改之后,它才能正常工作。

1

在else条件下递增x和y不会影响递归调用变量。将递归看作是对同一方法的新调用。 因此,当递归调用x和y被初始化回到1和3时,可以将x和y作为参数传递,以便更新后的值可以传递给每个递归调用。有一种方法可以解决这个问题...

希望这有助于:)

+0

@Hydryh - 或者让'x'和'y'类变量 – 2013-04-10 01:52:03

0

注:

  • 最好还是使用调用递归函数本身最初的通话功能,进行初始化

  • 使用static数据,否则他们将不会通过递归调用来保存

  • recur(z++)将执行像recur(z)从而导致无限复发,使用recur(z+1)代替

代码:

public class recursion 
{ 
    public static void main(String[] args) 
    { 
     startRecursive(0); 
    } 

    // using static data 
    private static int x = 1, y = 3; 

    // initial call 
    public static void startRecursive (int initZ) 
    { 
     x = 1; 
     y = 3; 

     // avoid infinite recurrence 
     if (initZ > 10) initZ = 0; 

     recur(initZ); 
    } 

    // recursive function 
    public static void recur(int z) 
    { 
     if (z == 10) 
     { 
      System.out.println("Done"); 
     } 
     else 
     { 
      System.out.println(x/y); 

      x += 1; 
      y += 2; 

      recur(z+1); // z++ will return z 
     } 
    } 
}