Weighting function
It would be nice to be able to generate streams in which the pairs appear in some useful order, rather than in the order that results from an ad hoc interleaving process. We can use a technique similar to the
merge
procedure of exercise
3.56
, if we define a way to say that one pair of integers is ''less than'' another. One way to do this is to define a ''weighting function''
W(i, j)
and stipulate that
(i₁, j₁)
is less than
(i₂, j₂)
if
W(i₁, j₁) ≤ W(i₂, j₂)
. Write a procedure
merge-weighted
that is like
merge
, except that it takes an additional argument
weight
, which is a procedure that computes the weight of a pair, and is used to determine the order in which elements should appear in the resulting merged stream. Using
merge-weighted
, generalize pairs to a procedure
weighted-pairs
that takes two streams, together with a procedure that computes a weighting function, and generates the stream of
pairs
, ordered according to weight. Use your procedure to generate
a. the stream of all pairs of positive integers
(i, j)
with
i ≤ j
ordered according to the sum
i + j
.
b. the stream of all pairs of positive integers
(i, j)
with
i ≤ j
, where neither
i
nor
j
is divisible by
2
,
3
, or
5
, and the pairs are ordered according to the sum
2i + 3j + 5ij
.