我需要编写一个方案函数(iterator (start step end))
,它返回一个函数,该函数在重复调用时返回序列(range (start step end))
中的数字。当序列用尽时,返回的函数应返回()
。
示例:(define next (iterator '(0 2 7)))
,(begin (next) (next) (next) (next) (next))
=> 0, 2, 4, 6, ()
; lab 1
(define (range L)
(let ((start (car L))
(step (car (cdr L)))
(end (car (cdr (cdr L)))))
(if (> start end)
cons '()
(cons start (range (list (+ start step) step end))))))
当我致电range '(0 2 7)
时,我得到(0 2 4 6)
但是我需要(0 2 4 6) ()
为什么cons '()
附加到我所拥有的列表
答案 0 :(得分:1)
正如@leppie指出的那样,接受的解决方案与您的文本不符。我会想到以下几点:
(define (iterator start step end)
(lambda ()
(if (>= start end)
'()
(begin0
start
(set! start (+ start step))))))
测试:
(define i (iterator 0 2 7))
(i)
=> 0
(i)
=> 2
(i)
=> 4
(i)
=> 6
(i)
=> '()
(i)
=> '()
请注意,我使用的是Racket的begin0
表单。如果您的计划没有,您可以更改为以下内容:
(define (iterator start step end)
(lambda ()
(if (>= start end)
'()
(let ((res start))
(set! start (+ start step))
res))))
答案 1 :(得分:0)
您可以通过传递三个参数来简化range
过程,而不是参数列表。除了一些轻微的语法错误,你就走在了正确的轨道上:
(define (range start step end)
(if (> start end)
'()
(cons start
(range (+ start step) step end))))
例如:
(range 0 2 7)
=> '(0 2 4 6)
请注意,列表已在'()
中结束(未显示)。如果您想要除结果之外的其他'()
,请尝试以下操作:
(list (range 0 2 7) '())
=> '((0 2 4 6) ())