sicp.io
1.2.4 · Сведение задачи

Алгоритм Евклида как сведение к меньшей задаче

Алгоритм Евклида сохраняет общие делители двух целых чисел, заменяя более крупную задачу парой с остатком, которая быстро уменьшается.

Вопрос для размышления

Почему замена a и b на b и остаток сохраняет их наибольший общий делитель?

  • Чтение remainder как следующего состояния задачи
  • Определение инварианта общего делителя между вызовами
  • Прослеживание точного целочисленного процесса до нулевого базового случая
  • Сравнение уменьшающейся последовательности вызовов с итоговым ответом

Если число делит как a, так и b, оно также делит остаток от деления a на b. Обратное утверждение также верно, поэтому пара меняется, тогда как ее наибольший общий делитель остается прежним.

Каждый вызов заменяет (a, b) на (b, remainder(a, b)). Когда второе значение достигает нуля, первое значение является сохраненным наибольшим общим делителем. После рекурсивного вызова не остается отложенных арифметических действий.

Код SICP111 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Первая программа возвращает 2. Вторая программа возвращает 21.

    На что обратить внимание в трассе

    Проследите за (206, 40), (40, 6), (6, 4), (4, 2) и (2, 0). Второй аргумент строго уменьшается до тех пор, пока базовый случай не раскроет инвариантный ответ.

    Попробуйте сами

    Измените программу и сравните результат.

    Запустите euclid со значениями 1999 и 97. Запишите каждую пару аргументов перед тем, как открыть итоговый наибольший общий делитель.

    Показать подсказку

    Примените remainder к текущей паре и переместите прежнее второе значение на первую позицию.

    Завершить этот урок

    В этой главе пройдено 0 из 18 уроков0%