Функция взвешивания
Интересно было бы уметь порождать потоки в каком-либо полезном порядке, а не в порядке, задаваемом к случаю придуманным процессом чередования. Можно воспользоваться методом, подобным процедуре
merge
из упражнения
3.56
, если мы определим способ сказать, что одна пара целых чисел «меньше» другой. Один из способов состоит в том, чтобы определить «функцию взвешивания»
W(i, j)
и постановить, что
(i₁, j₁)
меньше, чем
(i₂, j₂)
, если
W(i₁, j₁) ≤ W(i₂, j₂)
. Напишите процедуру
merge-weighted
, которая во всем подобна
merge
, но только в качестве дополнительного аргумента принимает процедуру
weight
, которая вычисляет вес пары, и используется для определения порядка, в котором элементы должны появляться в получающемся смешанном потоке. При помощи
merge-weighted
напишите процедуру
weighted-pairs
, обобщающую
pairs
. Она должна принимать два потока и процедуру, вычисляющую функцию взвешивания, и порождать поток пар, упорядоченных по весу. Породите, используя эту процедуру:
а. Поток всех пар натуральных чисел
(i, j)
где
i ≤ j
, упорядоченных по сумме
i + j
.
б. поток всех пар натуральных чисел
(i, j)
, где
i ≤ j
, ни
i
, ни
j
не делится ни на
2
, ни на
3
, ни на
5
, и пары упорядочены по значению суммы
2i + 3j + 5ij
.
Комментарии отсутствуют.