在Racket中是否有类似Python的itertools.count
?我想创建一个均匀间隔数字的无限流。 in-naturals
与我想要的类似,但不提供步骤。我想不要重新发明轮子,但如果没有相应的功能,怎么写一个? (我认为应该使用发电机)
答案 0 :(得分:6)
您可以使用count
获得与in-range
相同的功能,其值为end
:
(define (count start step)
(in-range start +inf.0 step))
例如:
(define s (count 2.5 0.5))
(stream-ref s 0)
=> 2.5
(stream-ref s 1)
=> 3.0
(stream-ref s 2)
=> 3.5
(stream-ref s 3)
=> 4.0
答案 1 :(得分:1)
自己完成这项功能可以在一行中完成:
(define (stream-from n s) (stream-cons n (stream-from (+ n s) s)))
为了测试它,这里是一个打印100000个数字的例子:
#lang racket
(require racket/stream)
(define (stream-from n s) (stream-cons n (stream-from (+ n s) s)))
(define (stream-while s p)
(let ([fst (stream-first s)])
(if (p fst) (stream-cons fst (stream-while (stream-rest s) p)) empty-stream)))
(define test (stream-while (stream-from 0 1) (λ (x) (< x 100000))))
(stream-for-each println test)