递归方法堆栈溢出错误



在我的代码中,我只是试图制作一个简单的程序,告诉你一个数字是否可以平均地划分成另一个数字(在这种情况下,这个数字是3(。现在我想说的是,如果x(这个数字没有被整除,加上0.01,这就产生了堆栈溢出错误。如果我把值设为0.2,它就表明9可以被三整除,而实际上,三之后被整除的下一个数字是6

public class divisible {
   public static void divide(double x) {
      double three = 3;
      double value = x%three;
      if (value==0) {
         System.out.println(x + " is a divisible of 3 ");
         return;
      }else{ 
         //System.out.println("x does not divide evenly into 3");
         divide(x+(.01));
      }
   }
   public static void main(String args[]) {
      divide(4);
   }
}

递归是无限的原因有点模糊:0.1不能在double中精确表示。当你把0.1加到3上十次时,你得到的不是4——你得到的是一个接近4但略大于它的数字。这个数字不能平分你的目标,所以递归继续到4.14.2等等,没有结束。

原因与此循环从未停止的原因相同(试试吧!(:

for (double x = 3 ; x != 4 ; x += 0.1) {
    System.out.println(x);
}

使用BigDecimal来代替double将解决问题,因为0.1将被精确地表示。当然,它仍然会打印错误的消息("is divisible of 3"是硬编码的,即使当余数为零时,x在调用中可能是完全不同的数字(。

您的问题是将两个双打与==进行比较。由于浮点运算的实现方式,这将产生不可靠的结果。你的方法应该是这样的:

public static void divide(int x) {
  int three = 3;
  int value = x%three;
  if (value==0) {
     System.out.println(x + " is a divisible of 3 ");
     return;
  }else{ 
     System.out.println("x does not divide evenly into 3");
//         divide(x+(.01));
  }
}

如果您希望使用双参数访问该方法,可以强制转换:

public static void divide(double x) {
    x = (int) Math.round(x);

如果您想处理大于Integer.MAX_VALUE的数字,您可以使用BigInteger

最新更新