非线性列表 Lisp 的 GCD

GCD of a non linear list Lisp

如何使用 Common Lisp 中的 Map 函数获取非线性列表的 GCD?

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

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

我不太了解如何使用映射函数,所以任何 help/hints 都很好。谢谢!

我不知道什么是非线性列表,但您可以使用 gcd 获得最大公约数,这是标准的一部分。如果你指的是某种树,你可能必须先把它弄平。

如果我理解正确,那很简单:

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