假设(list "apple" "orange" "apple" "grape" "orange")
并生成(list (list 2 "apple") (list 2 "orange") (list 1 "grape"))
。
最常见的水果将首先出现在生产列表中。 在关系的情况下,按照字母顺序增加对水果的捆绑对进行排序。
在本地使用map,filter,foldr和quicksort等抽象列表功能。没有递归。
如果没有递归,我不知道怎么做。
我是这样写的:(define (function list)
(cond
[(empty? list) empty]
[else
(local
(define (helper1 a b)
(cond
[(equal? a b) a]
[else b]))
(define T (foldr helper1 (first list) (rest list)))
(define (count a)
(cond
[(equal? a T) true]
[else false]))
(define new-list (quicksort (length (filter count list)) >))]
答案 0 :(得分:0)
最有效的方法是使用(可变)哈希表:
(define (count-by-type lst)
; create hash
(define h (make-hash))
; update hash, creating entries if needed, otherwise adding 1 to existing entry
(map (lambda (e) (hash-update! h e add1 0)) lst)
; create list of (count key) elements from hash and sort accordingly
(sort (map (lambda (e) (list (cdr e) (car e))) (hash->list h))
(lambda (x y) (or (> (car x) (car y))
(and (= (car x) (car y)) (string<? (cadr x) (cadr y)))))))
测试:
> (count-by-type (list "apple" "orange" "apple" "grape" "orange"))
'((2 "apple") (2 "orange") (1 "grape"))
答案 1 :(得分:0)
我刚刚重新开始own answer from a previous question。这似乎是一个类似的任务,但没有struct
使用哈希只需要通过未排序的列表进行一次传递,然后生成一个列表,然后使用特殊的<
- 按功能排序,然后是水果排序。
这些提示是针对功能性解决方案的。首先对参数(sort list-of-fruits string>?)
进行排序。 按降序和结果的对位。
鉴于列表至少有一个元素:
(let rec ((cur (car sorted-fruits)) (cnt 1) (lst (cdr sorted-fruits)) (acc '()))
(cond ((equal? cur (car lst)) (rec cur (add1 cnt) (cdr lst) acc))
(else (rec (car lst) 1 (cdr lst) (cons (list cnt cur) acc)))))
这会产生一个带有计数的升序列表。
如果你再次排序:
(sort list-of-counts-and-fruit (lambda (x y) (>= (car x) (car y)))
Racket中的 sort
是稳定的。这意味着如果您在列表中有两个具有相同计数的数字,它们将以其原始顺序结束。原始顺序是升序动物顺序,因此结果按计数降序排序,然后命名升序。
我猜你的程序可以通过将它们链接在一起来制作,也许使用let
来存储中间体,使表达式更短,更易读。