给出一个列表
所在的L=(M,A1,A2,...,An)
。查找L1=(Ai,Ai+1,...,Ai+k), i+k<=N, i>=1,
M=Ai+Ai+1+...Ai+k
子列表例如:
L=(1 3 -16 5 7 8 2 2), M=12
结果:L1=(1 3 -16) L1=(5 7) L1=(8 2 2) for 5+7=12, 1+3-16=12, 8+2+2=12
如何在lisp中解决这个问题?
答案 0 :(得分:0)
让我们先尝试找一个子列表。
Sum = 10
List = (2 4 3 3 1)
如果你试图递减怎么办?列表为(2 . (4 3 3 1))
,减去2。
Sum = 8
List = (4 3 3 1)
再次:
Sum = 4
List = (3 3 1)
再次:
Sum = 1
List = (3 1)
最后:
Sum = -2
List = (1)
我们失败了,因为总和是负数。
我们再试一次,但这一次我们跳过第一个元素:
Sum = 10
List = (4 3 3 1)
......等等。
Sum = 0
List = (1)
现在我们成功了,因为总和为零,我们没有达到空列表。
(d.... s...... (s.. l...)
(l.....
((s...... (s.. l... r.....)
(c...
((m..... s..) n..)
((z.... s..) (l... (n....... r.....)))
((c.... l...) (d............-.... (h... . t...) l...
(s...... (- s.. h...) t... (l...* h... r.....))))
(t n..))))
(m..... (l..... (l...) (s...... s.. l... n..)) l...)))
答案 1 :(得分:0)
解决方案:
(setq l '(6 1 2 3 4 5 6 7 -1))
(setq comb nil)
(setq rez nil)
(defun sublist (lst)
(secondfunction (car lst) (cdr lst))
)
(defun secondfunction (head other)
(run (cdr other) (cdr other) (list(car other)) (list(list(car other))))
(final comb head nil)
)
(defun final (lst el result)
(if (>(length lst) 0)
(progn
(if(eq(loop for x in (car lst) sum x) el) (final (cdr lst) el (append result (cons (car lst) nil)))
(if(>(length lst) 0)(final (cdr lst) el result )))
)
(setq rez result)
)
)
(final comb (car l) nil)
(defun run (lst1 lst2 temp r)
(if (not(eq(car lst1) nil))
(if (not(eq(car lst2) nil))
(run lst1 (cdr lst2) (append temp (list (car lst2))) (append r (list (append temp (list (car lst2))))))
(run (cdr lst1) (cdr lst1) (list(car lst1)) (append r (list(list (car lst1)))))
)
(setq comb r)
)
)
(sublist l)