4

itertools.count Racket中是否有 Python 的类似物?我想创建一个无限的均匀间隔数字流。in-naturals类似于我想要的,但不提供步骤。我不想重新发明轮子,但如果没有等效的功能,如何写一个?(我想,应该使用发电机)

4

2 回答 2

6

count您可以使用in-range无限end值​​获得与 Python 相同的功能:

(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
于 2013-02-20T13:53:26.143 回答
2

自己制作函数可以在一行中完成:

(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)
于 2017-01-05T13:34:14.067 回答