Scheme 方案:如何合并两个流
我有这些函数Scheme 方案:如何合并两个流,scheme,Scheme,我有这些函数 (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
(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 (merge-streams stream-of-even-natural-numbers stream-of-odd-natural-numbers) 10)
我必须得到输出(01 2 3 4 5 6 7 8 9)。。这是怎么做到的
我最好的想法是,这是错误的:
(define merge-streams
(lambda (x y)
(cons (car x)
(merge-streams y (cdr x)))))
这里有一个建议:
(define (merge-streams s1 s2)
(cond
[(empty-stream? s1) s2)] ; nothing to merge from s1
[(empty-stream? s2) s1)] ; nothing to merge from s2
[else (let ([h1 (stream-car s1)]
[h2 (stream-car s2)])
(cons h1
(lambda ()
(cons h2
(stream-merge (stream-rest s1)
(stream-rest s2))))))]))
它使用了一些必须首先定义的帮助函数。@chris对编辑感到抱歉(我没有注意到有一个)。@soegaard哦,没关系,只是我手工缩进了(包括
trace lambda
的正确语义含义),所以我宁愿保留它。:-)由于OP打算对结果调用流头
,我觉得这应该生成一个流而不是一个列表。我添加了一个(lambda()…),以便将合并的流转换为流(我希望我得到了正确的表示)。我设法理解了您正在做的事情,并在那之后提出了我自己的解决方案<代码>(定义(合并流s1 s2)(cons(车辆s1)(延迟(合并流s2)(强制!(cdr s1‘‘‘‘)’)