锁定老帖子 主题:关于MIT Scheme产生流的尝试
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
|
|||||
---|---|---|---|---|---|
作者 | 正文 | ||||
发表时间:2010-03-07
最后修改:2010-03-08
在研究用stream产生二元组,或是三元组时(满足一定约束,i<j等等)我们利用流的特性只产生前部分的数据,至于什么数据会排在前头,则有我们的规则,总的来说,有一定的约束性,比如产生序列的顺序问题,后来探讨的权重函数也是我们会遇到的问题。(plt Scheme上对流的支持不好,才有mit Scheme的编译器实现)
;产生三元组的方法可以参照下图:
利用前面的介绍的二元组产生原理(将第一个元素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)))) 很容易发现,该过程使得上图中右上方和右下方部分交替的生成元组,如此我们也发现了这种失衡的结果。当然,流的特性让原有的顺序产生些许变化,或需我们可以从结果上进行优化,也就是后来又谈到的权重函数。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||
返回顶楼 | |||||
浏览 1913 次