用高阶累积法展平Scheme中的惰性列表
我试图找到一个实现,它使用用高阶累积法展平Scheme中的惰性列表,scheme,racket,lazy-evaluation,lazy-sequences,accumulate,Scheme,Racket,Lazy Evaluation,Lazy Sequences,Accumulate,我试图找到一个实现,它使用interleave和lzlst acculate将惰性列表的惰性列表展平,这是我编写的过程。这是迄今为止的代码: (define lz-lst-accumulate (lambda (op initial lz) (if (empty? lz) initial (op (head lz) (lambda() (lz-lst-accumulate op initial (tail lz))))))) (define
interleave
和lzlst acculate
将惰性列表的惰性列表展平,这是我编写的过程。这是迄今为止的代码:
(define lz-lst-accumulate
(lambda (op initial lz)
(if (empty? lz)
initial
(op (head lz)
(lambda() (lz-lst-accumulate op initial (tail lz)))))))
(define interleave
(lambda (lz1 lz2)
(if (empty? lz1)
(lz2)
(cons (head lz1)
(interleave (lz2) (lambda() (tail lz1)))))))
(define all-div-from-flattened
(lambda (lower)
(lz-lst-accumulate interleave '() (all-div-from lower))))
(define take
(lambda (lz-lst n)
(if (= n 0)
(list)
(cons (car lz-lst)
(take (tail lz-lst) (sub1 n))))))
(define head
(lambda (lz)
(car lz)))
(define tail
(lambda (lz-lst)
((cdr lz-lst))))
(define lz-lst-map
(lambda (f lz)
(if (empty? lz)
lz
(cons (f (head lz))
(lambda () (lz-lst-map f (tail lz)))))))
; Signature: all-div-from (low)
; Type: [Number -> Lazy-list]
; Purpose: return a lazy-list of lazy-lists. The nested lazy-lists
; correspond to the integers greater than lower in an
; increasing order. Each nested lazy-list is the list of
; all integers divisible by i for some i>=lower.
; Pre-conditions: low is an integer
; Tests: > (define lz3 (all-div-from 7))
; > (take lz3 3)
; '((7 . #<procedure>) (8 . #<procedure>) (9 . #<procedure>))
; > (take (head lz3) 3)
; '(7 14 21)
; > (take (head (tail lz3)) 3)
; '(8 16 24)
(define all-div-from
(lambda(lower)
(cons (lz-lst-map (lambda(x) (* x lower)) (div-from 1 1))
(lambda() (all-div-from (add1 lower))))))
; Signature: div-from (low int)
; Type: [[Number*Number]-> Lazy-list]
; Purpose: return the lazy-list of all integers that
; are larger than low and divisible by int
; Pre-conditions: int > low
; Tests: > (define lz1 (div-from 5 12))
; > (take lz1 3)
; '(12 24 36)
; > (define lz2 (div-from 7 10))
; > (take lz2 4)
; '(10 20 30 40)
(define div-from
(lambda (lower int)
(lz-lst-filter (lambda(x) (> x (- lower 1)))
(lz-lst-map (lambda(x) (* x int)) (integers-from 1)))))
(define integers-from
(lambda (n) (cons n
(lambda () (integers-from (+ 1 n))))))
(define lz-lst-filter
(lambda (p lz)
(cond ((empty? lz) lz)
((p (head lz))
(cons (head lz)
(lambda () (lz-lst-filter p (tail lz)))))
(else (lz-lst-filter p (tail lz))))))
但当我在解释器中尝试这句话时:
> (take (all-div-from-flattened 3) 3)
它进入一个无限循环
我的实现必须使用lz lst累计
、交织
和所有扁平化div
过程
关于如何使它工作有什么建议吗?您的
交错
不会产生一个惰性列表;它生成一个普通的列表:它使用带有两个参数的cons
,第二个参数没有包装在lambda
中。因此,cons
强制第二个参数通过,导致失控计算:
(define interleave
(lambda (lz1 dlz2) ; "delayed" lz2
(if (empty? lz1)
(dlz2)
(cons (head lz1)
; here:
(interleave (dlz2) (lambda () (tail lz1)))))))
(define lz-lst-accumulate
(lambda (op initial lz)
(if (empty? lz)
initial
(op (head lz)
(lambda () (lz-lst-accumulate op initial (tail lz)))))))
(下部的所有div)
生成正确的输出,((下部。)
,但是对(lz lst acculate interleave'()(下部的所有div))的调用会随着
(interleave [lower . <proc1>]
(lambda () (lz-lst-accumulate interleave '() (<proc2>))))
(cons lower
(interleave (lz-lst-accumulate interleave '() (<proc2>))
(lambda () (<proc1>))))
生成一个惰性列表
显然(现在)的解决方案是添加缺少的lambda
:
(define interleave
(lambda (lz1 lz2)
(if (empty? lz1)
(lz2)
(cons (head lz1)
(lambda () (interleave (lz2) (lambda() (tail lz1))))))))
现在它运行正常:
(取(从7开始的所有分区)10)
;值12:(7 8 14 9 21 16 28 10 35 24)
通过引入
(define integers-from-by
(lambda (n d) (cons n
(lambda () (integers-from (+ n d) d)))))
那么
你也可以
(define mults-above-of ; n in [int, 2*int ..], n > lower
(lambda (lower int)
(let ((x (* (+ (quotient lower int) 1) int)))
(integers-from-by x int))))
其次,
如果您将交织
更改为按顺序组合流,并在所有多个定义中切换到所有多个以上的
,则(lz lst累计交织顺序'()(所有多个以上2))
将按顺序定义所有合成数的延迟列表,通过计算埃拉托斯烯筛中的砷含量
从这一点来看,这只是让自己拥有自己的又一步(在该页面上搜索“SiCp”)
另一句话:take
应该调整为不强制流的额外元素。更多。虽然您提供了显示您正在尝试的代码是好事,但不幸的是,head
、tail
和中的所有div都没有定义,所以(对我来说)很难说出问题所在。另外,你能举一个输入和正确输出的例子吗?谢谢你的回复,我马上就做@GregHendershott,我添加了缺少的程序和一个正确的示例。您是否验证了其他功能,例如lz lst map
和lz lst filter?
?
(define integers-from-by
(lambda (n d) (cons n
(lambda () (integers-from (+ n d) d)))))
;(define div-from
; (lambda (lower int)
; (lz-lst-filter (lambda(x) (> x (- lower 1)))
; (lz-lst-map (lambda(x) (* x int)) (integers-from 1)))))
(define mults-from-of ; n in [int, 2*int ..], n >= lower
(lambda (lower int)
(let ((x (* (quotient (+ lower (- int 1)) int) int)))
(integers-from-by x int))))
(define mults-above-of ; n in [int, 2*int ..], n > lower
(lambda (lower int)
(let ((x (* (+ (quotient lower int) 1) int)))
(integers-from-by x int))))
; (define all-div-from
; (lambda(lower)
; (cons (lz-lst-map (lambda(x) (* x lower)) (div-from 1 1))
; (lambda() (all-div-from (add1 lower))))))
(define all-mults-from
(lambda (lower)
(lz-lst-map (lambda (n) (mults-from-of n n))
; or just (integers-from-by n n)
(integers-from-by lower 1))))