2015-01-11 7 views
1

Как получить GCD нелинейного списка с использованием функций Map в Common Lisp?GCD нелинейного списка Lisp

defun gcd (a b) 
    (cond 
     ((eq b 0) a) 
     (t (gcd b (mod a b))))) 

(defun gcdall (l) 
    (cond 
     ((null l) nil) 
     (t (...)) 
) 
) 

Я не совсем понимаю, как использовать картографические функции, поэтому любая помощь/подсказки будет отличной. Благодаря!

+0

вам нужно использовать карту делать? Если нет, вы можете просто найти gcd автомобиля, gcd из cdr, и взять gcd обоих из них. – malisper

ответ

1

Если я понимаю, что вы хотите правильно, это достаточно легко:

(defun nested-gcd (list) 
    (reduce #'gcd list :key (lambda (elt) 
          (if (consp elt) 
           (nested-gcd elt) 
           elt)))) 
0

Я не знаю, что такое нелинейный список, но вы можете получить наибольший общий делитель, используя gcd, который является частью стандарта. Если вы имеете в виду какое-то дерево, вам, возможно, придется сначала сгладить его.

+1

По нелинейному списку я имею в виду список форм (2 (12 10) 18 (3)). Я думал, что должен быть прямой метод, не сплющивая его. – user1012732

+0

Gcd ассоциативен, поэтому вы можете делать это шаг за шагом, встроенный с обходом дерева (что и показывало gsg). – Svante