检查列表是否在球拍中排序

时间:2018-10-07 20:40:40

标签: racket

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

为此,我需要定义一个带有比较参数和列表的函数,并检查列表是否基于该参数排序。我显然不能只使用“排序?”。这是我到目前为止的内容:

    (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 :(得分: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,所以我想您正在混合使用这两个参数?

答案 1 :(得分: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您的函数arguments变量,然后它可以工作。 目前,您的is-member?仅适用于数字列表,因为相等性测试器=仅适用于数字。 考虑eqlequal和其他相等性测试...