List 非线性列表Lisp的GCD

List 非线性列表Lisp的GCD,list,common-lisp,greatest-common-divisor,List,Common Lisp,Greatest Common Divisor,如何使用Common Lisp中的映射函数获取非线性列表的GCD defun gcd (a b) (cond ((eq b 0) a) (t (gcd b (mod a b))))) (defun gcdall (l) (cond ((null l) nil) (t (...)) ) ) 我不太明白如何使用映射函数,所以任何帮助/提示都很好。谢谢 我不知道什么是非线性列表,但是你可以通过使用标准中的gcd获得最大公约数。

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

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

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

我不太明白如何使用映射函数,所以任何帮助/提示都很好。谢谢

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

如果我正确理解你想要什么,那就很容易了:

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

所谓非线性列表,我指的是形式(2(12 10)18(3))的列表。我认为必须有一个直接的方法,而不需要将其展平。Gcd是关联的,所以您可以通过树遍历一步一步地完成它(这是gsg所展示的)。您需要使用map吗?如果没有,你可以找到汽车的gcd,cdr的gcd,然后取这两个的gcd。