Определить доминирующий элемент списка (с частотй более 50%) - Lisp
Формулировка задачи:
Мое решение:
(defun dominate (lst &optional (res nil) (l (length lst))) (cond ((null lst) (caar (remove-if #'(lambda (x) (< (cadr x) (* 0.5 l))) res))) (t (let* ((a (car lst)) (lstn (remove a lst)) (ll (length lstn))) (dominate lstn (cons (list a (- (length lst) (length lstn))) res) l))))) ==> dominate (dominate '(1 2 3 3 3 1 3 3 2)) ==> 3 (dominate '(1 2 3 1 2 3)) ==> NIL
Решение задачи: «Определить доминирующий элемент списка (с частотй более 50%)»
textual
Листинг программы
(defun dominate (lst) (let ((h (gensym 'h)) (n 0) (r nil)) (hashCreate h) (iter (for a in lst) (counting a into n) (if (hashKeyExist h a) (setf (hashGet h a) (+ 1 (car (hashGet h a)))) (hashPut h a 1))) (hashMap h #'(lambda (k v) (when (> v (* 0.5 n)) (push k r)))) (hashDestroy h) r))
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д