Бесконечная восходящая последовательность в ракетке
Есть ли аналог Питона? itertools.count
в ракетку? Я хочу создать бесконечный поток из равномерно распределенных чисел. in-naturals
похоже на то, что я хочу, но не обеспечивает шаг. Я бы не хотел изобретать велосипед, но если нет эквивалентной функции, как ее написать? (Полагаю, следует использовать генераторы)
2 ответа
Решение
Вы можете получить такую же функциональность Python 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
Самостоятельно выполнить функцию можно в одной строке:
(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)