Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LISP > Функция для работы с подсписками


Автор: Mars30 6.5.2014, 18:28
Помогите решить задачку на Common lisp.
Написать функцию, которая возвращает подсписок данного списка, сумма числовых элементов которого максимальна

Автор: _sg 24.5.2014, 09:03
подсписки возвращаются со всех уровней:
Код

(defun sublists (w &optional acc &aux (a (car w)) (d (cdr w)))
  (cond ((null w) acc)
        ((atom a) (sublists d acc))
        (t (sublists a (cons a (sublists d acc))))))

(defun sum-sublist (w)
  (mapcar #'(lambda (a)
              (list (reduce #'+ (remove-if-not #'numberp a)) a)) w))

(defun max-sum-sublists (w
                         &aux
                         (v (sum-sublist (sublists w)))
                         (m (reduce #'max v :key #'car)))
  (mapcar #'cadr (remove-if-not #'(lambda (a) (eq (car a) m)) v)))

> (max-sum-sublists '((a 3 4) (b 2 (c 3 4) 5) (d 7) ((e 7))))
((A 3 4) (C 3 4) (B 2 (C 3 4) 5) (D 7) (E 7))
> (max-sum-sublists '((a 3 4) (b 2 (c 3 4) 5) (d 7) ((e 8))))
((E 8))

Автор: _sg 24.5.2014, 19:29
для верхнего уровня:
Код

(defun sum-sublist (w)
  (mapcar #'(lambda (a)
              (list (reduce #'+ (remove-if-not #'numberp a)) a)) w))
 
(defun max-sum-sublists (w
                         &aux
                         (v (sum-sublist w))
                         (m (reduce #'max v :key #'car)))
  (mapcar #'cadr (remove-if-not #'(lambda (a) (eq (car a) m)) v)))

> (max-sum-sublists '((a 3 4) (b 2 (c 3 4) 5) (d 7) ((e 7))))
((A 3 4) (B 2 (C 3 4) 5) (D 7))
> (max-sum-sublists '((a 3 4) (b 2 (c 3 4) 5) (d 8) ((e 7))))
((D 8))
> (max-sum-sublists '((a 3 4) (b 2 (c 3 4) 5) (d 8) ((e 8))))
((D 8))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)