
定义一个函数,接受一个列表并返回一个列表,指出相等元素出现的次数,并由最常见至最少见的排序
要点
cons
构造列表,构造的结果是包含car
与cdr
的组合对象mapcar
对列表的每一项进行一种操作sort
使用自定义的比较方法进行排序- 递归遍历列表
cons
的使用
(cons 'a 'b) ; Expected: (A . B)
mapcar
的使用
将列表中每个数字都乘 2
(mapcar #'(lambda (e) (if (numberp e) (* e 2) e)) '(1 a 2 b 3 c)) ; Expected: (2 A 4 B 6 C)
sort
使用
将数字元素放在前,其他元素放在后面,并将数字按照从小到大排序
(defun my-sort (l) (sort l #'(lambda (e1 e2) (if (numberp e1) (if (numberp e2) (< e1 e2) T))))) (format t "~A ~%" (my-sort '(8 z 6 a 2 i 3 (1 8) (j k) 5))) ; Expected: (2 3 5 6 8 Z A I (1 8) (J K))
复合使用
;;; 统计在列表中,每个字母出现的次数,并将结果按照出现次数由大到小排序 (defun occurrences (l) (if (null l) ; 若为nil,返回 nil nil (let ( (r (occurrences (cdr l))) ; 递归求值 (alpha (car l))) (sort (if (null r) ; 对结果排序 (cons (cons (car l) 1) r) ; 若结果为nil,则说明是第一次遇到字母,直接放入空表 (if (every #'(lambda (item) (not (eql (car item) alpha))) r) ; 当前的字母在表中是否没有记录 (cons (cons (car l) 1) r) ; 没有记录直接放入记录中,次数为 1 (mapcar ; 有记录,在原来基础上 + 1 #'(lambda (item) (if (eql (car item) alpha) (cons alpha (+ (cdr item) 1)) item)) r ))) #'(lambda (item1 item2) (> (cdr item1) (cdr item2))))))) (format t "~A" (occurrences '(a b a d a c d c a))) ; Expected: ((A . 4) (C . 2) (D . 2) (B . 1))
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于