Я скрытный дилетант, пытающийся научить себя CS , и в настоящее время я прохожу путь через первую главу SICP .
Я сталкивался с примером процедуры «подсчета изменений» и, подобно некоторым другим , хотя я понимаю саму процедуру, я борюсь с предпосылкой на котором она основана:
Предположим, мы думаем о доступных типах монет, расположенных в некотором порядке. Тогда выполняется следующее соотношение:
Количество способов изменить сумму a с использованием n видов монет равно
количество способов изменить сумму a с использованием всех монет, кроме первого, плюс
количество способов изменения суммы a - d используя все n видов монет, где d - номинал монет первого типа.
Чтобы понять, почему это правда, обратите внимание, что способы внесения изменений можно разделить на две группы: те, которые не используют монеты первого типа, и те, которые используют. Таким образом, общее количество способов внесения изменений на определенную сумму равно количеству способов внесения изменений на сумму без использования монет первого типа, плюс количество способов внесения изменений при условии, что мы используем Первый вид монет. Но последнее число равно количеству способов внесения изменений в сумму, оставшуюся после использования монеты первого рода.
Проблема и процедура доступны в контекст здесь , но я не буду включать процедуру, так как это логика c, над которой я борюсь, а не сама процедура.
Что я не понимаю, так это почему они всегда равны:
- Общее количество «путей», меньше «способов» получения полной суммы без использования монеты первого типа .
- Количество «способов» использования всех типов монет для получения оставшейся суммы, после вычитания номинала первой монеты .
Я пробежал бесчисленные тестовые примеры вручную, и да, отношения верны, но я не понимаю, почему.
Первое предложение их объяснения имеет смысл:
Обратите внимание, что способы внесения изменений могут быть разделены разделить на две группы: те, которые не используют монеты первого типа, и те, которые используют.
Если у нас есть общее количество «путей», мы можем разделить эту сумму на две группы в соответствии с этим правилом. Нет проблем.
Второе предложение также ясно:
Таким образом, общее количество способов внести изменения для некоторой суммы равно числу способов внести изменения для сумма без использования монеты первого типа, а также количество способов внесения изменений при условии, что мы используем монету первого типа.
Это просто означает, что общее количество способов является сумма способов, которые были разделены на две категории. ОК.
Вот где меня теряют:
последнее число равно количеству способов внесения изменений на сумму, оставшуюся после использования монеты первого рода. .
Я предполагаю, что это означает, что "последнее число" относится ко всем способам внесения изменений, которые должны использовать хотя бы одну монету первого номинала.
Почему и как это число соответствует количеству способов внесения изменений со всеми монетами на общую сумму, меньшую номинала первой монеты?
Чтобы попытаться визуализировать проблему, Я повторил это как попытку достичь определенного веса 80 кг на штангу с набором из 3 весовых номиналов:
- Красный: 5 кг
- Зеленый: 10 кг
- Синий: 20 кг
Я выложил каждый сценарий визуально, и отношения действительно сохранились, но я до сих пор не понимаю, почему:
Рекурсия для бодибилдеров
Такое ощущение, что Ответ на этот вопрос прямо у меня под носом, но, возможно, размер этого конкретного придатка навсегда затеняет ответ.