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