Scheme 无限流的所有元素对的流
如何定义返回无限流中所有元素对的过程 s={1,2,3,4,5,6,…}Scheme 无限流的所有元素对的流,scheme,racket,Scheme,Racket,如何定义返回无限流中所有元素对的过程 s={1,2,3,4,5,6,…} =>{(2,1),(3,2),(3,1),(4,3),(4,2),(4,1),…} 这是我的代码,但它不像流那样工作,它一直无限地运行,并且内存不足 (define (stream-pairs s) (define (iter s save) (stream-append (stream-map (lambda (x) (stream-cons (stream-first s) x))
=>{(2,1),(3,2),(3,1),(4,3),(4,2),(4,1),…} 这是我的代码,但它不像流那样工作,它一直无限地运行,并且内存不足
(define (stream-pairs s)
(define (iter s save)
(stream-append (stream-map (lambda (x) (stream-cons (stream-first s) x))
save)
(iter (stream-rest s) (stream-cons save (stream-first s)))))
(iter s empty-stream))
(define A (stream-cons 1 (scale-stream 2 A)))
(define C (stream-pairs A))
A={1,2,4,8,16,…}
由于问题规定给定流是无限的:
(define (stream-pairs strm)
(stream-cons (cons (stream-first strm)
(stream-first (stream-rest strm)))
(stream-pairs (stream-rest (stream-rest strm)))))
(如果流不是无限的,则需要在函数前面添加一个空保护。)
注意:如果您使用流而不是球拍流,请将
define
更改为define stream
我不清楚您所说的“成对流”是什么意思,但假设您想要这样的东西:
> (stream-subset-pairs (in-naturals) 5)
'((0 . 1) (1 . 2) (2 . 3) (3 . 4))
作为预期输出,这里有一个解决方案:
(define (stream-subset-pairs stream i)
(define subset ; collect all elements up to i by iterating over the list and all #'s in sequence
(for/list ([element stream]
[position (in-naturals)]
#:break (= position i)) ; break when we have reached the # of elements we want to collect
element))
(let-values ([(ignore result) ; wrapper because we want for/fold to produce one result (last-element is just a state variable)
(for/fold ([last-element null]
[result empty])
([element subset]) ; iterate through the subset
(values element (if (null? last-element) ; if we are on the first loop
result ; ignore it
(cons (last-element element) result))))]) ; else add a pair of the last result and this result
result))
事实证明,Racket的
streamappend
不会延迟它的最后一个(至少)参数,因此iter
调用streamappend
,哪个调用iter
。。。因此,循环
一种方法是重新实现与此处使用的流映射
融合的流附加
,作为一个简单的递归函数。这样,尾部将在延迟流cons
的保护下正常运行
另一种方法是使用伪流cons
的流rest
1:
(require racket/stream)
(define (stream-pairs s)
(define (iter s save)
(stream-append (stream-map (lambda (x) (list (stream-first s) x))
save) ;^^^^
(stream-rest
(stream-cons 'fake ;<<-----------------
(iter (stream-rest s)
(stream-cons (stream-first s) save))))))
(iter s empty-stream))
(define A (stream-cons 1 (stream-map add1 A))) ; easier to follow
(define C (stream-pairs A))
不是重复的:它是特定于Java的,答案是特定于Java的。下次,当你提出问题时,不要在14小时后发布所有相关的代码和示例。(iter(stream rest s)(stream cons(stream first s)save))你的意思是?它仍然无限地运行。
> (stream-rest (stream-cons 1 (/ 1 0)))
#<stream>