关于MIT Scheme产生流的尝试

本文探讨了使用流式编程生成二元组和三元组的方法,并通过具体示例展示了如何在pltScheme环境下利用流的特性来生成这些元组。讨论了在生成过程中可能遇到的顺序问题及权重函数的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值