scheme函数返回步长值,但不会向其附加空列表

时间:2014-07-21 14:23:48

标签: scheme

我需要编写一个方案函数(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 '()附加到我所拥有的列表

2 个答案:

答案 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) ())