Я начинаю следующий курс SICP по MIT OpenCourseWare, используя как видео-лекции, так и книгу, доступную в Интернете. Вчера я наткнулся на пример, который спрашивает, можем ли мы написать процедуру, чтобы вычислить количество способов изменить любую заданную сумму денег.
Эта проблема имеет простое решение как рекурсивную процедуру:
(define (count-change amount)
(cc amount 5))
(define (cc amount kinds-of-coins)
(cond ((= amount 0) 1)
((or (< amount 0) (= kinds-of-coins 0)) 0)
(else (+ (cc amount
(- kinds-of-coins 1))
(cc (- amount
(first-denomination kinds-of-coins))
kinds-of-coins)))))
(define (first-denomination kinds-of-coins)
(cond ((= kinds-of-coins 1) 1)
((= kinds-of-coins 2) 5)
((= kinds-of-coins 3) 10)
((= kinds-of-coins 4) 25)
((= kinds-of-coins 5) 50)))
Если вы хотите узнать больше об этом, я взял его из здесь.
они вычисляют число (N) способов изменения кватити (A) с использованием K видов монет, добавляя:
-
количество способов (X) изменения A без монет первого типа.
-
Количество способов (Y) изменения (A - D), где D - номинал монеты fisrt, используя ВСЕ К-типы монет.
Проблема в том, что я просто этого не понимаю. Следуя, они пытаются объяснить, говоря:
"Чтобы понять, почему это так, обратите внимание, что способы внесения изменений можно разделить на две группы: те, которые не используют ни один из монет первого типа, и те, которые делают. Поэтому общее количество способов для внесения изменений для некоторой суммы равно количеству способов внести изменения в сумму без использования какого-либо первого монета, плюс количество способов сделать изменения, предполагая, что мы используем первый вид монеты. (Последнее предложение совпадает с добавлением N = X + Y?) Но последнее число равно числу способов внести изменения в сумму, оставшуюся после использования монеты первого рода. (После использования этой монеты они ссылаются на способы внесения изменений с или без монеты первого типа?)"
Я понимаю, как они реализовали рекурсивный алгоритм, но я не могу понять, как они туда попали. Английский - это не мой родной язык, поэтому я мог бы что-то упустить. Если бы вы могли объяснить мне, используя другие термины, логику решения, я бы очень признателен. Спасибо.