Loops 和组合中的无穷循环
我有以下代码来搜索符合给定总和的组合。但问题是十进制数太少 比如,当我试图用3.15和0.40来拟合11.90的和时,程序开始一个无限循环。当我尝试使用3.15和2.45时,我得到了以下正确的结果(3.15 | 3.15 | 3.15 | 3.15 | 2.45)Loops 和组合中的无穷循环,loops,sum,combinations,infinite-loop,c#-2.0,Loops,Sum,Combinations,Infinite Loop,C# 2.0,我有以下代码来搜索符合给定总和的组合。但问题是十进制数太少 比如,当我试图用3.15和0.40来拟合11.90的和时,程序开始一个无限循环。当我尝试使用3.15和2.45时,我得到了以下正确的结果(3.15 | 3.15 | 3.15 | 3.15 | 2.45) public static void findNumbers(List<double> ar, double sum, List<List<double>> res, List<double&
public static void findNumbers(List<double> ar, double sum, List<List<double>> res, List<double> r, int i)
{
// If current sum becomes negative
if (sum < 0)
{
return;
}
// if we get exact answer
if (sum < 2)
{
res.Add(r);
return;
}
// Recur for all remaining elements that
// have value smaller than sum.
while (i < ar.Count() && sum - ar[i] >= 0)
{
// Till every element in the array starting
// from i which can contribute to the sum
r.Add(ar[i]); // Add them to list
// recur for next numbers
findNumbers(ar, sum - ar[i], res, r, i);
i++;
r.RemoveAt(r.Count() - 1);
}
}
publicstaticvoidfindnumbers(列表ar、双和、列表res、列表r、int i)
{
//如果当前总和为负
如果(总和<0)
{
返回;
}
//如果我们得到确切的答案
如果(总和<2)
{
决议增补(r);
返回;
}
//对所有剩余的
//具有小于总和的值。
而(i=0)
{
//直到数组中的每个元素都开始
//从我这里可以得到一笔钱
r、 Add(ar[i]);//将它们添加到列表中
//重复下一个数字
findNumbers(ar,sum-ar[i],res,r,i);
i++;
r、 移除(r.Count()-1);
}
}
我知道如何消除这个循环。您的代码有两个可讨论的要点 如果(总和<2) 你不应该找一个确切的数字吗?e、 g.sum==0或更好的Math.Abs(sum)<容差(如0.0005),因为您使用的是double 决议增补(r) 使用res.Add(r)可以添加对r的引用。 然后使用r.RemoveAt(r.Count()-1);您在res列表中引用的r也将受到影响。因此,我建议在res中添加一份r:
res.Add(r.GetRange(0, r.Count));
编辑:
请参阅上的工作示例
如果样本的总和为11.90,数组为3.15和0.4,公差为2.0=>9.90,那么这并不能回答您的问题,但是如果(总和=0 | |总和<2),则第一次检入
似乎是多余的;如果sum==0
,那么它也总是小于2,所以if(sum<2)
就可以了。使用调试器并逐步完成代码。您似乎遇到了一个条件,sum-ar[I]
永远不小于2。此外,如果您展示了用于调用此方法的代码,该代码会导致无限循环。尝试过,没有成功@MuriloPereira。请参阅我的编辑。如果你仍然有问题,请。在github上提供您的代码。
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 0,4, 3,15, 3,15, 3,15)
(0,4, 0,4, 0,4, 0,4, 3,15, 3,15, 3,15)
(0,4, 0,4, 0,4, 3,15, 3,15, 3,15)
(0,4, 0,4, 3,15, 3,15, 3,15)