【问题标题】:How do I determine if a list in Racket is in ascending order, descending order, or neither如何确定 Racket 中的列表是升序、降序还是两者都不是
【发布时间】:2019-11-12 15:44:09
【问题描述】:

我需要创建一个函数来识别列表是按升序还是降序排列。如果列表是升序,则函数将输出“升序”,如果列表是降序,则函数将输出“降序”,如果列表既不递增也不递减,则函数将输出“混合”。

到目前为止,这是我的代码,显然它不起作用。我对在 Racket 中进行递归还是很陌生,所以我很确定这不是你正确进行递归的方式。我已经看到了确定列表是否按升序排列的解决方案,但这些没有帮助,因为在这里我必须在这里检查 3 种不同的情况,包括基本情况。

(define (order? L)
  (cond
    [(empty? L) '()]
    [(> (first L) (first (rest L)))
     (order? (rest L)) "descending"]
    [(< (first L) (first (rest L)))
    (order? (rest L)) "ascending"]
    [else ("mixed")]))

这是显示 3 种不同情况的 3 个示例。

(check-expect (order? (list 2 4 6 8)) "ascending")
(check-expect (order? (list 2 8 4 1 9 10 2)) "mixed")
(check-expect (order? (list 9 8 7 6 3 2)) "descending")

【问题讨论】:

    标签: string list recursion racket


    【解决方案1】:

    其实,对于这个问题,你不需要使用递归。 &lt;=&gt;= 操作符是你所需要的(&lt;&gt; 是不够的,如果有重复的元素它们会失败):

    (define (order? lst)
      (cond ((apply >= lst)  "ascending")
            ((apply <= lst) "descending")
            (else                "mixed")))
    

    上面的工作是因为&lt;=&gt;= 接受多个参数,并且要测试一个列表是否按升序排列,我们只需要看看这是不是真的:

    (<= 2 4 6 8)
    => #t
    

    对于降序情况也是如此。我们使用apply 将列表作为参数传递给支持可变数量参数的运算符。它按预期工作:

    (order? (list 2 4 6 8))
    => "ascending"
    (order? (list 2 8 4 1 9 10 2))
    => "mixed"
    (order? (list 9 8 7 6 3 2))
    => "descending"
    

    要使用递归解决问题,您基本上必须在每个元素和下一个元素上应用 &lt;=&gt;=,如果找到 false 条件则停止。

    您应该编写两个帮助程序,一个用于测试列表是否为升序,另一个用于测试它是否为降序。

    您尝试的解决方案的主要概念问题是您没有在正确的时刻停止,并且基本情况是错误的 - 它应该在您的两个助手上返回 true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2020-04-04
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多