Сортировка списка с использованием моей собственной функции для сортировки - PullRequest
1 голос
/ 14 марта 2019

Я продолжаю изучать Racket, и теперь мне нужно отсортировать список, используя мою собственную функцию для сортировки списка.

Каждый элемент списка, который также является списком, должен быть передан в качестве параметра моей собственной функции, и функция будет возвращать реальное значение в диапазоне [0, 1].

В двух словах: у меня будет список списков, которые нужно отсортировать, используя функцию, которая имеет в качестве параметра список, и он будет возвращать реальное значение между [0, 1].

В Racket я нашел функцию sort :

(sort '(1 3 4 2) <)

Мне нужно что-то подобное, но вместо использования < мне нужно использовать свою собственную функцию.

#lang racket

(define my-list '(1 2 3 4) '(5 7 3 1) '(9 4 1 8))

(define my-function
  (lambda (lst)
    (let ([result ; Do my own calculations ])
       result))) ; Result is a real number between [0,1].

(define list-sorted (my-sort my-list my-function))

ПРИМЕЧАНИЕ : представьте себе my-function как черный ящик со списком в качестве входа и действительным числом в качестве выхода.

Как я могу это сделать?

Я думал создать еще один список, my-list-real-values со значениями действительных чисел для каждого элемента в my-list в том же порядке, а затем использовать (sort my-list-real-values <) для его сортировки, но я не знаю, как связать два списка, my-list-real-values с my-list, для сортировки my-list при сортировке my-list-real-values.

Возможно, я смогу использовать Хеш-таблицы , но я не знаю, является ли это функцией только Ракетки, или ее можно использовать и со Схемой.

1 Ответ

3 голосов
/ 14 марта 2019

Это должно работать на большинстве диалектов Схемы, которые предоставляют процедуру sort:

(define (my-sort my-list my-function)
  (sort my-list
        (lambda (l1 l2) (< (my-function l1) (my-function l2)))))

Согласно документам , less-than? - это любая процедура, которая:

Принимает два элемента lst и возвращает истинное значение, если первое меньше (т.е. должно быть отсортировано раньше), чем второе

Это также должно работать, но это зависит от Racket:

(define (my-sort my-list my-function)
  (sort my-list #:key my-function #:cache-keys? #t <))   

Аргумент #:key extract-key используется для извлечения значения ключа для сравнения из каждого элемента списка.

По умолчанию extract-key применяется к двум элементам списка для каждого сравнения, но если cache-keys? имеет значение true, тогда extract-key функция используется ровно один раз для каждого элемента списка. Укажите истинное значение для кеш-ключей? , когда extract-key является дорогостоящей операцией

...