【问题标题】:how to make a counting list in racket between two variables如何在两个变量之间在球拍中制作计数列表
【发布时间】:2016-09-21 02:22:47
【问题描述】:

我一直在尝试在 Racket 中创建一个算作(MakeList a b) 的函数,然后显示一个列表,例如(a, a+1, a+2, ..., b)。我一直在尝试,但在网上找到了有关如何创建列表然后添加到列表的内容,但提供的有用信息很少。任何有关如何创建此函数的帮助都会很棒。

【问题讨论】:

  • 您要查找的函数是来自racket/listrange。如果你必须自己实现它,这听起来像是功课。
  • 您尝试了什么,遇到了什么错误?

标签: functional-programming scheme racket computer-science


【解决方案1】:

在任何 Scheme 或 Lisp 实现中,这是一种简单而有效的方法:

(define (makelist a b)
  (do ((i b (- i 1))
       (lst '() (cons i lst)))
    ((< i a) lst)))

它从一个空列表开始,添加b,不断在前面添加较小的列表,并在到达a时返回结果。

【讨论】:

    【解决方案2】:

    我知道这很可能是作业问题。正如@AlexisKing 指出的那样,range 函数已经存在。但如果你坚持自己写这篇文章,我想提供一些帮助。 Racket 是一种非常有趣的语言,我不想让你气馁。

    从好的方面看,听起来你大多知道你需要它做什么

    (a, a+1, a+2, ..., b)
    

    那就开始吧

    (define (make-list a b)
      (cons a ...))
    

    这里的... 是什么?正如您在预期输出中所说,... 将是

    (a+1 ... b)
    

    所以(a+1 ... b) 是一个从a+1b 的列表——或者换句话说:(make-list (add1 a) b)

    嗯,这很容易。让我们填写。

    (define (make-list a b)
      (cons a (make-list (add1 a) b)))

    但是等等,这应该让你感到震惊。为什么?因为我们只是永远继续......

    (cons a (cons a+1 (cons a+2 (cons a+3 ... (cons a+Infinity ...)))))
    

    我们必须告诉我们的程序在某个时候停止,对吗?但是什么时候应该停止呢?

    让我们写一个小真值表来帮助我们。我们表的表达式将是(make-list 0 4)

    a     b    previous        stop?
    0     4    N/A             no
    1     4    (0 ...)         no
    2     4    (0 1 ...)       no
    3     4    (0 1 2 ...)     no
    4     4    (0 1 2 3 ...)   no
    5     4    (0 1 2 3 4 ...) yes – (0 1 2 3 4) is the value we'd like
    

    好的,这样就很清楚了。当a 大于 b 时,我们可以完成我们的列表。请记住,为了表示列表的结束,我们使用空列表empty

    (define (make-list a b)
      (if (> a b)
          empty
          (cons a (make-list (add1 a) b))))

    检查一下

    (make-list 0 4) ;=> '(0 1 2 3 4)
    (make-list 2 6) ;=> '(2 3 4 5 6)
    (make-list 3 3) ;=> '(3)
    (make-list 6 3) ;=> '()
    

    【讨论】:

      【解决方案3】:

      Racket的for/list函数也可以如下使用:

      (define (make-list a b)
        (for/list ((i (in-naturals))
                   #:break (> i b)
                   #:when (and (>= i a) (<= i b)) )
          i))
      
      (make-list 5 10)
      

      输出:

      '(5 6 7 8 9 10)
      

      但 a 和 b 必须 >= 0。

      【讨论】:

        【解决方案4】:

        以下循环也可用于创建这样的列表:

        (define (ml a b)
          (let loop ((a a) (lst '()))
            (if (> a b)
                (reverse lst)
                (loop (add1 a) (cons a lst)))))
        
        
        (ml 5 10)
        

        输出:

        '(5 6 7 8 9 10)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-23
          • 1970-01-01
          • 1970-01-01
          • 2020-02-26
          • 2023-03-23
          • 2018-09-13
          • 2016-11-16
          • 1970-01-01
          相关资源
          最近更新 更多