【问题标题】:Infinity loop in sum combination和组合中的无限循环
【发布时间】:2019-01-30 19:03:33
【问题描述】:

我有以下代码来搜索适合给定总和的组合。但是问题在于小数位数。

就像,当我尝试用 3.15 和 0.40 拟合总和 11.90 时,程序会启动一个无限循环。当我尝试使用 3.15 和 2.45 时,我收到以下正确的结果 (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);
    }
}

我知道如何去掉这个循环。

【问题讨论】:

  • 这并不能回答你的问题,但if (sum == 0 || sum &lt; 2) 的第一次检查似乎是多余的;如果sum == 0,那么它也总是小于2,所以if (sum &lt; 2) 可以。
  • 使用调试器并单步调试您的代码。您似乎遇到了sum - ar[I] 永远不会小于 2 的情况。此外,如果您显示用于调用导致无限循环的此方法的代码,将会很有帮助。

标签: loops sum combinations infinite-loop c#-2.0


【解决方案1】:

您的代码有两个可讨论的点

如果(总和

您不应该寻找一个确切的金额吗?例如sum == 0 或更好 Math.Abs​​(sum)

res.Add(r);

使用 res.Add(r) 您正在添加对 r 的引用。 但随后使用 r.RemoveAt(r.Count() - 1);您在 res 列表中引用的 r 也会受到影响。所以我建议将 r 的副本添加到 res:

res.Add(r.GetRange(0, r.Count));

编辑:

https://github.com/hcetinkaya/Combinations.git查看工作示例

您的样本总和 = 11.90,数组为 3.15 和 0.4,容差为 2.0 => 9.90

(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)

【讨论】:

  • 试过了,没有成功
  • 嗨@MuriloPereira。请参阅我的编辑。如果您仍然有问题,请。在 github 上提供您的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多