Префикс Decrement vs Subtract, используемый в рекурсии - PullRequest
0 голосов
/ 30 апреля 2020

Я хотел бы узнать, почему, когда я изменяю 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)
        );
    }

1 Ответ

2 голосов
/ 30 апреля 2020

Если вы изменили все 3, то каждый раз он уменьшается снова и снова. Таким образом, он становится n-1, n-2 и n-3.

Другими словами, n-1 не мутирует n. Но --n делает.

...