论坛首页 综合技术论坛

关于MIT Scheme产生流的尝试

浏览 1913 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-03-07   最后修改:2010-03-08
FP

在研究用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))))

很容易发现,该过程使得上图中右上方和右下方部分交替的生成元组,如此我们也发现了这种失衡的结果。当然,流的特性让原有的顺序产生些许变化,或需我们可以从结果上进行优化,也就是后来又谈到的权重函数。

论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics