【问题标题】:scheme function returns step values but doesnt append an empty list to it方案函数返回步长值但不向其附加空列表
【发布时间】:2014-07-21 14:23:48
【问题描述】:

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

【问题讨论】:

  • Protip:学习格式化和缩进方案代码。
  • 你可能只想要'()(或者'(())
  • 我希望 range '(0 2 7) 返回 0 2 4 6 '()
  • 是我的 cons '() 问题吗?
  • 您的文字和代码不匹配。

标签: scheme


【解决方案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 表单。如果你的 Scheme 没有,你可以改成如下:

(define (iterator start step end)
  (lambda ()
    (if (>= start end) 
        '()
        (let ((res start))
          (set! start (+ start step))
          res))))

【讨论】:

  • 我喜欢begin0,它可以在Scheme中轻松定义:(define-syntax begin0 (syntax-rules () ((_ x) x) ((_ x y ...) (let ((tmp x)) y ... tmp))))
【解决方案2】:

您可以通过传递三个参数而不是参数列表来简化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) ())

【讨论】:

  • 好的,谢谢 cons '() '() 真正的作用。它会创建一个包含两个空列表的列表吗?
  • @LokiKira 不,(cons '() '()) 创建一个包含一个项目的列表,一个空列表。
  • 那么如何创建两个空列表呢?
  • @LokiKira (list '() '())
  • (cons '() (cons '() '()))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2017-08-29
相关资源
最近更新 更多