Проверка, отсортирован ли список в Racket - PullRequest
0 голосов
/ 07 октября 2018

Я работаю над воссозданием некоторых базовых функций ракет для проекта.

Для этого мне нужно определить функцию, которая принимает аргумент сравнения и список, и проверяет, является ли списокотсортировано на основе этого аргумента.Я, очевидно, не могу просто использовать «отсортировано?».Вот что у меня есть:

    (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 голосов
/ 09 октября 2018

Если вы хотите вызвать функцию, подобную этой

(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? будет работать только со списком чисел, поскольку тестер равенства = надежно работает только для чисел.Рассмотрим eql, equal и другие тесты на равенство ...

0 голосов
/ 08 октября 2018

Ваша первая функция возвращает функцию:

(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, поэтому я полагаю, что вы смешиваете два?

...