【问题标题】:Prefix Decrement vs Subtract Used in Recursion递归中使用的前缀减量与减法
【发布时间】:2020-08-14 13:54:11
【问题描述】:

我想知道为什么当我将 n - 1 更改为 --n 时,函数会抛出异常。 据我了解, --n 和 n - 1 产生相同的结果。请参阅打印()。请帮忙。谢谢。

    private static void Print(int n)
    {
        if (n == 0) return;

        Console.Write($"[{n}] -> ");
        // regardless of --n or n--, the results are the same.
        Print(n - 1);
    }

    private static double KnapSack(int maxWeight, Product[] products)
    {
        double maxValue = KnapSack(maxWeight, products, products.Length);
        Console.WriteLine($"The max value the knapsack can hold is: {maxValue:C2}");
        return maxValue;
    }
    private static double KnapSack(int maxWeight, Product[] products, int n)
    {
        if (n == 0 || maxWeight == 0)
            return 0;

        if (products[n - 1].Weight > maxWeight)
            return KnapSack(maxWeight, products, n - 1);

        else return Max
        (
            // if we change n - 1 to --n, it will throw an exception.
            products[n - 1].Price + KnapSack(maxWeight - products[n - 1].Weight, products, n - 1),
            KnapSack(maxWeight, products, n - 1)
        );
    }

【问题讨论】:

  • --n 更改 nn-1 只是计算一个新值,但不将其存储在 n 中。

标签: c# recursion dynamic-programming knapsack-problem


【解决方案1】:

如果您更改了所有 3 个,那么每次它都会一次又一次地递减。所以它变成了 n-1、n-2 和 n-3。

换句话说,n-1 不会改变 n。但是 --n 可以。

【讨论】:

  • 您好安德鲁,感谢您的回复。以 Print(int 3) 为例,如果我调用 --n, Print(= 2) ,使用 n - 1 这样做会产生相同的结果。所以,当你提到 --n 变异但 n - 1 不变异时,我不明白。
  • @SherNing Check this example。注意a 的值永远不会改变,但b 的值会不断减小。这就是区别。 “变异”意味着值发生了变化,这就是示例中b 发生的情况,但a 不会发生这种情况。
  • @SherNing - 他们似乎在您的特定示例中给出相同的结果,但他们做不同的事情。你可以有n = 3 然后做Print(n-1) 一百万次,猜猜n 会是什么?仍然是 3。但是如果你有 n = 3 然后做 Print(--n) 一百万次,你猜怎么着。 n 将是 -999,997。
猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 2011-07-21
  • 2021-11-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
相关资源
最近更新 更多