[英]Abstract List Functions in Racket/Scheme - Num of element occurrences in list
所以我目前停留在“簡單”上? 在球拍中發揮作用。 它使用具有lambda語言的中級學生。
對此的一些限制是不允許遞歸,本地函數也不可以。 它是簡單明了的抽象列表函數。
該函數應該做的是獲取一個數字列表,並輸出一個對列表,其中每個對都具有第一個元素作為數字,而第二個元素是列表中已出現的數字。
例子:
(1 1 2 3) => ((1 2) (2 1) (3 1))
(2 3 4 3) => ((2 1) (3 2) (4 1))
我有一個通過輸入數字列表和一個數字來產生出現次數的函數:
(define (occurrences lon n)
(length (filter (lambda (x) (= x n)) lon)))
我的方法顯然是錯誤的:
(define (num-pairs-occurrences lon)
(list (lambda (x) (map (occurrences lon x) (remove x lon)) x))
我以為上面的方法可以工作,但是顯然我的lambda放置不正確。 有任何想法嗎?
這比您想象的要棘手。 您可能已經注意到,我們必須在輸出列表中刪除重復的元素。 為此,最好定義一個remove-duplicates
輔助函數(也使用抽象列表函數)-實際上,它是如此普遍,是Racket中的內置函數,但是在您當前的語言設置中不可用:
(define (remove-duplicates lst)
(foldr (lambda (e acc)
(if (member e acc)
acc
(cons e acc)))
'()
lst))
現在,可以使用抽象列表功能輕松組合解決方案:
(define (num-pairs-occurrences lon)
(map (lambda (e) (list e (occurrences lon e)))
(remove-duplicates lon)))
上面的返回和輸出列表的順序可能不同,但是沒關系。 在您提出以下要求之前:是的,我們確實需要該輔助功能。 請不要沒有它的解決方案...
一個簡單,獨立的解決方案是:
(define (num-pairs-occurences lst)
(foldl (lambda (e r)
(if (or (null? r) (not (= (caar r) e)))
(cons (list e 1) r)
(cons (list e (add1 (cadar r))) (cdr r))))
null
(sort lst >)))
基本上,您首先對列表進行排序,然后將其折疊。 如果獲得的元素(e)與結果列表(r)的第一個元素相同,則增加計數,否則將新的子列表添加到r。
如果按>
(降序)排序,則實際上可以使用foldl
,這樣可以提高內存效率。 如果按<
(升序)排序,則需要使用效率較低的文件foldr
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.