Java 我的程序中有一个bug。当我传递某个int时返回-1的递归方法

Java 我的程序中有一个bug。当我传递某个int时返回-1的递归方法,java,recursion,Java,Recursion,我的代码并不适用于所有情况: public class P2Payment{ int computePay(int DaysWorked){ int pay = 0; if(DaysWorked<=0) { return -1; } else if(DaysWorked==1){ return pay = 1; } els

我的代码并不适用于所有情况:

public class P2Payment{
    int computePay(int DaysWorked){ 
        int pay = 0;
        if(DaysWorked<=0)
        {
            return -1;
        }
        else if(DaysWorked==1){
            return pay = 1;
        }
        else if (DaysWorked == 2){
            return pay = 2;
        }
        else { // daysWorked >= 3
            DaysWorked = DaysWorked-1;
            pay = 2 * computePay(DaysWorked);
            return pay;
        }
    }
    int computeSaving(int sum, int PDay, int NumofDays){    
        if(NumofDays == 1){
            return 1;
        }
        else if(PDay <= NumofDays){
            sum = sum+computePay(PDay);
            PDay++;
            int accumlateSum = computeSaving(sum, PDay ,NumofDays);
            return accumlateSum; 
        }
        return sum; 
    }
}
公共类支付{
int computePay(int DaysWorked){
int pay=0;
如果(DaysWorked=3
DaysWorked=DaysWorked-1;
支付=2*计算日(天);
报酬;
}
}
int computeSaving(int sum,int PDay,int NumofDays){
如果(NumofDays==1){
返回1;
}

否则如果(PDay失败的原因是
int
最多存储2^31-1

您在
computePay
中不断乘以2,这就是为什么输入后会得到不好的结果

numOfDays>=32

如果你真的需要这么大的数字(任意精度),我建议使用。 否则可以考虑<代码>长< /> >(高达2 ^ 63-1)。

例如:

import java.math.BigInteger;

public class P2Payment {
  BigInteger computePay(int DaysWorked) {
    BigInteger pay;
    if (DaysWorked == 1) {
      return new BigInteger("1");
    }

    else {
      DaysWorked = DaysWorked - 1;
      pay = computePay(DaysWorked).multiply(new BigInteger("2"));
      return pay;
    }
  }

  BigInteger computeSaving(BigInteger sum, int PDay, int NumofDays) {
    if (NumofDays == 1) {
      return new BigInteger("1");
    } else if (PDay <= NumofDays) {
      sum = sum.add(computePay(PDay));
      PDay++;
      BigInteger accumlateSum = computeSaving(sum, PDay, NumofDays);
      return accumlateSum;
    }
    return sum;

  }

}
结果:

4294967296


除此之外,还有一个语句应该放在大括号中。这是真的,这在技术上与预期一样,因为这些语句只会在其他语句不成立时执行。如果条件不成立,您可以添加一点规范来准确解释您预期会发生什么吗?您是否使用IDE编写此语句?如果是,您应该确保打开on自动缩进。(在Eclipse中,按Ctrl-Shift-F格式化代码。)这将带来巨大的不同:你不会再错过这样的事情,因为它会取消你认为是
else
子句的一部分但不是的行,并且它会立即变得明显。我肯定会喜欢一份工作,我在一个月内赚足够的钱来溢出一个整数…语法是:type variable;biginger computeSaving?…但有人可能会认为这表明代码中的另一个错误!月薪支付通常不需要使用
BigInteger
来存储它们。我认为更大的问题是,代码应该计算什么还不完全清楚。@chiastic security可能他们的货币过度膨胀了?:D Like一个月工资为10万英镑的首席执行官将获得33亿越南盾的薪酬。好的,阅读代码需要一段时间才能处理。现在让我更改代码。代码执行以下操作:您的薪酬每天翻倍。递归方法computePay返回给定日期的美分薪酬。
public static void main(String[] args) {
{ 
      P2Payment p = new P2Payment();
      System.out.println(p.computeSaving(new BigInteger("1"),1,32));
} // end main