Вы можете сделать это за один этап, используя рекурсию (что будет быстрее и эффективнее, чем метод, который я собираюсь предложить), но он может быть более читабельным, модульным и более простым для кода, если вы сгенерируете всесначала возможные решения, отфильтруйте по тем, которые являются действительными, и затем верните лучшее из этих решений.
Чтобы сделать это таким образом, вам понадобится функция генератора и отображения (я бы предложил два вложенных списка картдля этой задачи), функцию фильтра (напишите ее; убавьте нечетное; затем посмотрите на функцию удаления-если-не в lisp) и уменьшающую функцию (верните наилучшее решение (самый длинный список) из отфильтрованных).
В SICP есть раздел, в котором обсуждается этот стиль подхода: http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-15.html#%_sec_2.2
Инженер по обработке сигналов счел бы естественным концептуализировать эти процессы в терминах сигналов, проходящих через каскадэтапы ...