Конвейер именованных этапов обработки данных
Перечисление, фильтрация, отображение и накопление разделяют задачу обработки данных на этапы, которые можно понимать и заменять независимо друг от друга.
Как конвейер последовательностей превращает вложенную рекурсию в именованные этапы?
- Перечисление конечного интервала входных данных
- Выбор значений с помощью предиката и их преобразование процедурой
- Накопление последовательности в один результат
- Чтение промежуточных форм последовательностей перед предсказанием конечного значения
enumerate-interval создает исходную последовательность. filter оставляет только значения, принятые odd?, а map заменяет каждое сохраненное значение его квадратом. Каждая процедура отвечает за одно решение.
accumulate объединяет преобразованную последовательность с помощью + и начального значения 0. Полная программа по-прежнему использует рекурсию, но управление распределено по повторно используемым этапам, а не сосредоточено в одной специализированной процедуре.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Программа возвращает 84 как результат 1² + 3² + 5² + 7².
Проследите за передачей списка интервала в filter, затем сравните укороченный список нечетных чисел со списком квадратов, поступающим в accumulate. Финальные сложения происходят только после того, как этапы сформируют эти промежуточные структуры. Трасса выполнения фиксирует весь конвейер данных для выбранного ввода.
Измените программу и сравните результат.
Замените odd? на even?, затем используйте cons и '() вместо + и 0 в accumulate. Предскажите результирующий список и порядок элементов в нем.
Показать подсказку
Финальный этап может принимать любую процедуру с двумя аргументами и подходящее начальное значение.