[英]Finding the occurence element in the list in racket
假設(list "apple" "orange" "apple" "grape" "orange")
並產生(list (list 2 "apple") (list 2 "orange") (list 1 "grape"))
。
最常見的水果將首先出現在生產的列表中。 如果是平局,請按字母升序對捆扎的結對和水果進行排序。
在本地使用抽象列表功能,例如地圖,過濾器,文件夾和快速排序。 沒有遞歸。
我不確定如何做到沒有遞歸。
我這樣寫:
(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)) >))]
最有效的方法是使用(可變)哈希表:
(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"))
我只是重新回答了上一個問題 。 這似乎是一個類似的任務,但沒有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)))
在球拍中sort
是穩定的。 這意味着如果列表中有兩個計數相等的對象,它們將以其原始順序結束。 原始順序是升序動物順序,因此結果是按計數降序排列,然后按名稱升序排列。
我猜想,可以通過將它們鏈接在一起來完成您的過程,也許可以使用let
存儲中間體來使表達式更短,更易讀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.