Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 无限流的所有元素对的流_Scheme_Racket - Fatal编程技术网

Scheme 无限流的所有元素对的流

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))

如何定义返回无限流中所有元素对的过程

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))
                                       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>