sicp.io
1.3.4 · Одно определение, два процесса

Цепная дробь как рекурсия или накопление

Одни и те же процедуры числителя и знаменателя могут управлять рекурсивным процессом сверху вниз или итеративным процессом от последнего члена.

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

Как порядок вычисления меняет процесс, не изменяя значение конечной дроби?

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

Рекурсивная версия начинается с члена 1, но не может завершить деление, пока не вернется остальная часть дроби. При каждом вызове сложение в знаменателе и деление остаются в ожидании, пока recur движется к k.

Итеративная версия начинается с члена k со значением 0.0 в качестве уже вычисленного хвоста. Каждый вызов заменяет result одним полным слоем дроби и движется к члену 1. В обоих примерах используются десять числителей и знаменателей, равных 1.0, поэтому они возвращают одинаковое конечное приближение к величине, обратной золотому сечению.

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

    Обе программы возвращают 0.6179775280898876 для десяти членов.

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

    В рекурсивном запуске проследите за recur по направлению к k до того, как вернутся результаты деления. В итеративном запуске наблюдайте, как result становится одним полным суффиксом при каждом вызове по мере уменьшения i. Трассы выполнения фиксируют точно выбранные глубину и члены.

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

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

    Измените k с 10 на 5 в обеих программах. Предположите, совпадут ли результаты по-прежнему, и запишите новое конечное значение.

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

    Оставьте числитель и знаменатель без изменений. Меньше становится только количество слоев дроби.

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

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