【问题标题】:Check if a list is sorted on Scheme检查列表是否按方案排序
【发布时间】:2014-11-02 06:28:06
【问题描述】:

我正在尝试检查列表是否已排序。如果已排序,则返回 True,否则返回 False。但是,此代码始终返回 True,我不知道如何修复它。

(define (ordered? lst)
    (cond (if (null? lst) #t)
          ((> (car(cdr(lst))) car(lst))
           (apply increasing? cdr(lst)))
          (else #f))
)

【问题讨论】:

    标签: list debugging sorting scheme


    【解决方案1】:

    让我们想想你的代码在做什么。

    首先去掉if,在cond子句中是不必要的。接下来你有一些非方案函数调用正在进行:

          ((> (car(cdr(lst))) car(lst))
    

    应该是:

      ((> (car (cdr lst)) (car lst))
    

    现在您通常不会以这种方式使用apply。相反,我会使用递归。

    所以这个:

           (apply increasing? cdr(lst)))
    

    变成:

        (ordered (cdr lst)))
    

    想想这是在做什么,我正在检查列表的其余部分是否已排序,如果在某些地方不是,则此表达式将评估为 false,并且表达式的其余部分也会。

    接下来我们要检查这个特定实例是否没有排序:

      (else #f))
    

    没问题。

    总而言之:

    (define (ordered? lst)
          (cond ((null? lst) #t)
                ((eq? (length lst) 1) #t)
          ((> (car (cdr lst)) (car lst))
            (ordered? (cdr lst)))
          (else #f))
         )
    

    【讨论】:

    • 这给了我未绑定的有序变量错误,因为我没有定义有序。所以我改为订购?但我得到另一个错误,说“汽车:参数类型错误”。
    • 哦,是的,你还得担心单例列表...我更新了所有内容。
    【解决方案2】:

    您不要在cond 中使用if。第一行应该是:

    (cond ((null? lst) #t)
    

    您的代码正在测试if 是否为真。由于这始终是正确的,因此该子句已被处理并返回 #t

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-25
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多