【发布时间】:2015-05-31 19:28:32
【问题描述】:
我有这些功能
(define force!
(lambda (thunk)
(thunk)))
(define stream-head
(lambda (s n)
(if (zero? n)
'()
(cons (car s)
(stream-head (force! (cdr s))
(1- n))))))
(define make-stream
(lambda (seed next)
(letrec ([produce (lambda (current)
(cons current
(lambda ()
(produce (next current)))))])
(produce seed))))
(define make-traced-stream
(lambda (seed next)
(letrec ([produce (trace-lambda produce (current)
(cons current
(lambda ()
(produce (next current)))))])
(produce seed))))
(define stream-of-even-natural-numbers
(make-traced-stream 0
(lambda (n)
(+ n 2))))
(define stream-of-odd-natural-numbers
(make-traced-stream 1
(lambda (n)
(+ n 2))))
我需要创建一个附加最后两个流的函数,这样如果我运行
(stream-head (append-stream stream-of-even-natural-numbers stream-of-odd-natural-numbers) 4)
I get the output (0 2 1 3)
问题是,流是无限的,我不知道如何创建一个知道何时停止从第一个流获取输入然后继续从最后一个流获取输入的函数。
之前我做了两个列表的合并,看起来像这样;
> (define (merge-streams s1 s2) (cons (car s1) (delay (merge-streams
> s2 (force!(cdr s1))))))
(stream-head (merge-stream stream-of-even-natural-numbers stream-of-odd-natural-numbers) 10)
= (0 1 2 3 4 5 6 7 8 9)
在这里我可以延迟,并交替从每个列表中选择哪个元素。
如何制定一个智能程序来附加列表?
【问题讨论】:
-
附注:
stream-head有一个错误 - 它强制流中的元素过多,这可能会导致不必要的错误。n==1不用强行拖尾,取car就行了,已经存在了。 -
您的
(0 2 1 3)示例不足以消除合并与附加的歧义,以收集您的含义。您是否打算让(head (append ...) 6)返回(0 2 4 1 3 5)和(head (append ...) 8)返回(0 2 4 6 1 3 5 7)?如果是这样,那似乎是不可能的。
标签: scheme