recursion - LISP 中的映射函数

标签 recursion mapping lisp

我有件事需要你的帮助。我有一个输入列表:

(1 ((2 3) (4 ((5) (6)))) ((7 8) (9 10)) 11)

我想在输出中接收以下内容:

((1 2 3 7 8 11)

 (1 2 3 9 10 11)

 (1 4 5 7 8 11)

 (1 4 5 9 10 11)

 (1 4 6 7 8 11)

 (1 4 6 9 10 11))

mapcar、mapcan、maplist...等功能都帮不上忙。我认为有必要使用递归函数,但不知道如何使用。

最佳答案

你描述的功能好像是DNF计算。这是我的解决方案:

(defun dnf (f)
  (when f
    (if (consp f)
        (let ((f-car-dnf (dnf (car f)))
              (f-cdr-dnf (dnf (cdr f))))
          (if (or (null f-cdr-dnf) (every #'consp f))
              (append f-car-dnf f-cdr-dnf)
              (mapcan
                (lambda (f-cdr-cj)
                        (mapcar (lambda (f-car-cj) (append f-car-cj f-cdr-cj))
                                f-car-dnf))
                f-cdr-dnf)))
        `((,f)))))

是实习任务吗?

关于recursion - LISP 中的映射函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28958278/

相关文章:

matlab - 在matlab中在 map 上绘制点

java - Orika 可以映射嵌套集合吗?

image - 需要更好的算法来找到具有最小距离的 2 组点之间的映射

emacs - 如何更改/删除 Emacs 菜单项?

list - 如何在没有 map 的情况下在 Lisp 中创建子列表列表?

python - 函数调用错误值

emacs - Emacs 中的词法作用域 : compatibility with older Emacsen

lisp - 如何通过知道其在 lisp 中的位置来查找列表元素?

java - BinarySearch 中的变量声明

javascript - 试图学习递归函数,但无法理解它