lisp - 子集总和 - lisp

标签 lisp common-lisp

<分区>

我正在尝试用 lisp 编写一个子集求和问题。 示例:(subsetsum '(1 2 3) 5) = (2 3), (subsetsum '(1 5 3) 2) =

我只能使用函数

(atom x) 
(null x)
(eq x y)
(equal x y)
(numberp x)
(append x y)
(car x)
(cdr x)
(cons x y) 
(if x y z)
(cond ... ) 
(let ((x y) (u v)) z)
(let* ((x y) (u v)) z)
(defun ...)
(quote x) and its short form 'x
(list x1 x2 ...)
(print ...)
(sort L fun)

我能得到任何提示吗?

最佳答案

此问题的简化推理如下:

  1. 你有一个列表 L 和一个数字 S
  2. 列表的第一个元素要么是解决方案的一部分,要么不是
  3. 如果第一个是解决方案的一部分,那么您需要使用它和更简单问题的解决方案 (rest L) (- S (first L))
  4. 如果它不是解决方案的一部分,那么您需要解决更简单的问题 (rest L) S
  5. 在某些情况下您可以避免进行搜索...例如,如果列表为空且 S 不为零,或者如果所有元素都大于零甚至相加所有这些你都无法到达 S...

关于lisp - 子集总和 - lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12649926/

相关文章:

c - 在自己编写扩展之前要在 C 中实现多少 lisp?

lisp - 如何运行 LISP 程序

lisp - clip正数创始人

lisp - 删除重复项时将槽值指定为键

list - LISP:为什么 mapcan 不接受我的列表作为参数?

regex - 在 emacs 标题行中设置正则表达式

arrays - 在 SBCL 中读取带有类型槽的结构

lisp - 关于保存宏/函数调用的任何提示?

common-lisp - 如何使用 sbcl 中的实时代码功能?

macos - CCL Cocoa 桥 "hello world"不工作?