使用我自己的功能对列表进行排序

时间:2019-03-14 09:12:04

标签: sorting functional-programming scheme racket

我正在继续学习球拍,现在我需要使用自己的函数对列表进行排序。

列表的每个元素(也就是列表)需要作为参数传递给我自己的函数,该函数将返回[0,1]之间的实数值。

简而言之:我将有一个列表列表,需要使用一个函数对其进行排序,该列表具有一个列表作为参数,并且它将返回[0,1]之间的实数值。

在球拍中,我发现了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-listmy-list链接起来,以对my-list-real-values进行排序。

也许我可以使用Hash Tables,但是我不知道这是Racket的唯一功能,还是可以与Scheme一起使用。

1 个答案:

答案 0 :(得分:3)

这在提供sort过程的大多数Scheme方言中都应适用:

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

根据docsless-than?任何过程,其中:

  

采用 lst 的两个元素,如果第一个元素小于第二个元素(即,应排序得早),则返回true值

这也应该起作用,但这是针对球拍的:

(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 是一项昂贵的操作时,为 cache-keys提供真值吗?