我有这个代码,但我不知道为什么它在无限循环中运行..我试图在调试模式下知道,但是即使在休息时它也没有返回控件并继续....
private static void helper(List<Long> result,List<Long> values,
Long duration, long tmp, int currPosition) {
while(currPosition<values.size()){
if( tmp==duration){
for (Long long1 : result) {
values.remove(values.indexOf(long1));
}
break;
}
else{
if(values.get(currPosition)<=duration && values.get(currPosition)+tmp<=duration){
result.add(values.get(currPosition));
tmp+=values.get(currPosition);
currPosition++;
helper(result,values,duration,tmp,currPosition);
}else if(values.get(currPosition)<=duration && values.get(currPosition)+tmp>duration){
currPosition++;
helper(result, values, duration, tmp, currPosition);
}else if(values.get(currPosition)>duration){
values.remove(currPosition);
helper(result, values, duration, tmp, currPosition);
}
}
}
}
答案 0 :(得分:4)
只有当duration
和tmp
相等时,您的循环才会退出,但它们永远不会更新。
除非参数相等,否则你的循环将永远运行(在这种情况下,它将运行一次直到break;
语句。)
答案 1 :(得分:1)
循环while(currPosition<values.size())
仅在您输入以下内容时停止:
if( tmp==duration){
for (Long long1 : result) {
values.remove(values.indexOf(long1));
}
break;
我无法看到您更新tmp
和duration
的位置,currPosition
值增加的位置。
因为currPosition
是int
值,所以永远不会将其作为参考传递给方法。因此currPosition
始终具有相同的值,永远不会更新。
当迭代次数> = =停止主循环的列表大小时,你应该有另一个计数来停止。
答案 2 :(得分:0)
您正在使用没有条件停止的递归。 而不是你最初的时间,你应该添加:
if(currPosition<values.size())
{
return;
}
您可以添加更适合的条件来停止递归。
此外,您在哪里更新duration
和tmp
?如果你想要停止但是你没有更新它们,它们应该是平等的。