首页 文章

检查列表是否在Racket中排序

提问于
浏览
0

我正在为项目重新创建一些基本的球拍功能 .

为此,我需要定义一个带有比较参数和列表的函数,并检查列表是否根据该参数进行排序 . 我显然不能只使用'已排序?' . 这是我到目前为止所拥有的:

(define (my-sorted? lst)
  (λ (x)
  (cond ((null? lst) #t)
        ((eq? (length lst) 1) #t)
        ((x (car (cdr lst)) (car lst))
         (my-sorted? (cdr lst)))
        (else #f))))

我不认为我正在应用比较功能,任何帮助?这个的标准输出应该是这样的:

(my-sorted? < '(2 5 6 9))
#t

虽然我很喜欢,但我的功能稍有不同 . 这个决定传递的比较是否是列表的成员,有点类似 . 这是我得到的:

(define (is-member? lst x)
  (cond
    [(empty? list) false]
    [(= (car list) x) true] ;here is the error i think
    [else (is-member? (rest list) x)]))

任何帮助或指导修复这些是非常感激,我似乎无法摆脱错误 .

2 回答

  • 0

    你的第一个函数返回一个函数:

    (define (my-sorted? lst)
      ; one expression, a function is returned
      (λ (x)
        (cond ((null? lst) #t)
              ((eq? (length lst) 1) #t)
              ((x (car (cdr lst)) (car lst))
               (my-sorted? (cdr lst)))
              (else #f))))
    

    这个问题是你的递归也返回一个需要以相同方式应用的函数 . 因此,当给出一个比较器时,你的函数将运行一步并返回一个需要一个新比较器的函数 . 你可以通过应用前一个值来解决这个问题:

    (define (my-sorted? lst)
      (λ (x)
        (cond ((null? lst) #t)
              ((eq? (length lst) 1) #t)
              ((x (car (cdr lst)) (car lst))
               ((my-sorted? (cdr lst)) x)) ; apply returned function with x
              (else #f))))
    

    或将其分开:

    (define (my-sorted? lst)
      (λ (x)
        (define (helper lst) ; keep the recursion away from the contract
          (cond ((null? lst) #t)
                ((eq? (length lst) 1) #t)
                ((x (car (cdr lst)) (car lst))
                 (helper? (cdr lst)))
                (else #f)))
        (helper lst)))
    

    在第二个函数中,您使用 list ,就好像它是一个值而不是一个函数 . list 是一个库函数,它返回其参数列表 . 你不能在一个函数上做 car . 你也没有使用列表参数 lst 所以我猜你混合了两个?

  • 0

    如果你想调用这样的函数

    (my-sorted? < '(2 5 6 9))
    #t
    

    你必须使参数列表看起来像它 - 你需要一个运算符 < 和一个列表作为参数 .

    (define (my-sorted? operator lst)
      (cond ((or (null? lst)
                 (= (length lst) 1))
             #t)
            ((operator (first lst) (second lst))
             (my-sorted? operator (rest lst)))
            (else #f)))
    

    您的第二个问题源于您怀疑的行中的拼写错误: list 是函数的名称 . 并且你将它更正为 lst 你的函数参数变量,然后它可以工作 . 目前,您的 is-member? 仅适用于数字列表,因为相等测试程序 = 仅对数字可靠地工作 . 考虑 eqlequal 和其他相等测试......

相关问题