Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 和组合中的无穷循环_Loops_Sum_Combinations_Infinite Loop_C# 2.0 - Fatal编程技术网

Loops 和组合中的无穷循环

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&

我有以下代码来搜索符合给定总和的组合。但问题是十进制数太少

比如,当我试图用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> 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)