簡體   English   中英

球拍/方案中的抽象列表功能-列表中元素出現的數量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM