我正在继续学习球拍,现在我需要使用自己的函数对列表进行排序。
列表的每个元素(也就是列表)需要作为参数传递给我自己的函数,该函数将返回[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-list
与my-list
链接起来,以对my-list-real-values
进行排序。
也许我可以使用Hash Tables,但是我不知道这是Racket的唯一功能,还是可以与Scheme一起使用。
答案 0 :(得分:3)
这在提供sort
过程的大多数Scheme方言中都应适用:
(define (my-sort my-list my-function)
(sort my-list
(lambda (l1 l2) (< (my-function l1) (my-function l2)))))
根据docs,less-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提供真值吗?