在研究用stream产生二元组,或是三元组时(满足一定约束,i<j等等)我们利用流的特性只产生前部分的数据,至于什么数据会排在前头,则有我们的规则,总的来说,有一定的约束性,比如产生序列的顺序问题,后来探讨的权重函数也是我们会遇到的问题。(plt Scheme上对流的支持不好,才有mit Scheme的编译器实现)
;产生三元组的方法可以参照下图:
S0T0U0 |
S0T0U1 S0T0U2 S0T0U3 … |
|
S0T1U1 S0T1U2 S0T1U3 … S0T2U2 S0T2U3 … … |
利用前面的介绍的二元组产生原理(将第一个元素s 看做已知固定数),过程定义如下:
(define (triples s t u)
(cons-stream (list (stream-car s) (stream-car t) (stream-car u))
(interleave (stream-map (lambda (x)
(list (stream-car s) (car x) (cadr x)))
(pairs t u))
(triples (stream-cdr s) (stream-cdr t) (stream-cdr u)))))
(display-stream (triples intergers intergers intergers) 20)
;结果为:
(1 1 1)
(1 1 1)
(2 2 2)
(1 1 1)
(2 2 2)
(1 2 2)
(3 3 3)
(1 1 2)
(2 2 2)
(3 3 3)
(1 1 3)
(2 3 3)
(1 3 3)
(4 4 4)
(1 1 4)
(2 2 3)
(1 2 3)
(3 3 3)
(1 1 5)
(2 3 3)
;value:done
从上述结果集中很容易发现三元组产生的顺序很不对称,达不到我们的预期,或者他的杂乱让我们觉得我们还有很多工作要做,是的,现在我们看看他的关于顺序产生的关键技术.
(define (interleave s1 s2)
(if (null? s1)
s2
(cons-stream (stream-car s1)
(interleave s2 (stream-cdr s1))))
很容易发现,该过程使得上图中右上方和右下方部分交替的生成元组,如此我们也发现了这种失衡的结果。当然,流的特性让原有的顺序产生些许变化,或需我们可以从结果上进行优化,也就是后来又谈到的权重函数。