在子列表中查找总和

时间:2017-10-05 12:02:42

标签: lisp

  

给出一个列表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中解决这个问题?

2 个答案:

答案 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)

现在我们成功了,因为总和为零,我们没有达到空列表。

提示和问题

  • 我们需要跳过一些N个第一个元素来尝试所有可能的起始位置;
  • 我们可以递归来解决子问题,同时减少总和;
  • 有不同的基本案例,总和以及列表;
  • 当总和为零时,表示我们迭代了我们查找的子列表;
  • 我们需要以某种方式收集该子列表,我们可以在哪里构建它?
  • 我们如何收集所有可能的子列表?

我的看法,混淆

(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)