Recursion lisp中的多级递归

Recursion lisp中的多级递归,recursion,lisp,common-lisp,Recursion,Lisp,Common Lisp,我对多级递归有一个问题。我有两个数字n1和n2。当计数器介于n1和n2之间时,我希望结果中包含这些数字,保持列表的内部结构 (解除izdvoj(列表n1 n2计数器) (cond((空列表A)计数器) ((和(原子(汽车清单A)) (计数器n2) (izdvoj(cdr列表A)n1 n2(+计数器1))) ((atom(汽车列表a)) (cons(车辆列表A)(izdvoj(cdr列表A)n1 n2(+计数器1))) (t (cons(izdvoj(汽车列表A)n1 n2计数器)(izdvoj(

我对多级递归有一个问题。我有两个数字
n1
n2
。当
计数器
介于
n1
n2
之间时,我希望结果中包含这些数字,保持列表的内部结构

(解除izdvoj(列表n1 n2计数器)
(cond((空列表A)计数器)
((和(原子(汽车清单A))
(<计数器n1)
(izdvoj(cdr列表A)n1 n2(+计数器1)))
((和(原子(汽车清单A))
(>计数器n2)
(izdvoj(cdr列表A)n1 n2(+计数器1)))
((atom(汽车列表a))
(cons(车辆列表A)(izdvoj(cdr列表A)n1 n2(+计数器1)))
(t
(cons(izdvoj(汽车列表A)n1 n2计数器)(izdvoj(cdr列表A)n1 n2计数器(())))
(izdvoj’(12(3(4)5(6(7))(8(9(10(11)))12))(13(14)(15)))7130)
结果应该是
((7))(8(9(10(11))12))(13))

我得到了
((4)((7))(((11)))12)((14)(15))


有什么建议吗?

最简单的方法是在助手中返回索引和结果。这样,当您完成
car
并准备好执行
cdr
时,您就知道如何继续:

(defun get-range (list from-index to-index)
  (labels ((aux (list cur acc)
             (cond ((null list)
                    (values (nreverse acc) cur))
                   ((not (atom (car list)))
                    (multiple-value-bind (res cur)
                                         (aux (car list) cur '())
                      (aux (cdr list) cur (cons res acc))))
                   ((<= from-index cur to-index)
                    (aux (cdr list) (1+ cur) (cons (car list) acc)))
                   (t (aux (cdr list) (1+ cur) acc)))))
    (nth-value 0 (aux list 1 '()))))

(get-range '(a b (c d (e (f))) (g h)) 3 5)
; ==> ((c d (e ())) ())
(定义获取范围(从索引到索引的列表)
(标签((辅助)(列表当前附件)
(cond((空列表)
(值(nreverse acc)cur)
((不是(atom(汽车列表)))
(多值绑定(rescur)
(辅助(车辆清单)cur'())
(辅助(cdr列表)cur(cons res acc)))
(((cde())())

最简单的方法是在助手中返回到目前为止的索引和结果。这样,当您完成
car
并准备好执行
cdr
时,您知道如何继续:

(defun get-range (list from-index to-index)
  (labels ((aux (list cur acc)
             (cond ((null list)
                    (values (nreverse acc) cur))
                   ((not (atom (car list)))
                    (multiple-value-bind (res cur)
                                         (aux (car list) cur '())
                      (aux (cdr list) cur (cons res acc))))
                   ((<= from-index cur to-index)
                    (aux (cdr list) (1+ cur) (cons (car list) acc)))
                   (t (aux (cdr list) (1+ cur) acc)))))
    (nth-value 0 (aux list 1 '()))))

(get-range '(a b (c d (e (f))) (g h)) 3 5)
; ==> ((c d (e ())) ())
(定义获取范围(从索引到索引的列表)
(标签((辅助)(列表当前附件)
(cond((空列表)
(值(nreverse acc)cur)
((不是(atom(汽车列表)))
(多值绑定(rescur)
(辅助(车辆清单)cur'())
(辅助(cdr列表)cur(cons res acc)))
(((cde())())

当列表为空时,会使用
计数器
(izdvoj'(ab(cd(e(f))(g h))3 5 0)?什么操作系统
brojac
?因为当列表为空时,会使用
计数器
,所以结果中的所有列表都应该像
(d(e(f.6).5)那样点着点
?你能用英文变量和函数名吗?不清楚你在做什么。brojac和计数器是一样的,(izdvoj'(ab(cd(e(f))(gh))35 0的结果应该是((cd(e())())的
(izdvoj'(ab(cd(e(f))(gh))35 0的结果是什么)
?什么操作系统
brojac
?由于当列表为空时使用
计数器
,因此结果中的所有列表都应该像
(d(e(f.6.5.4)
?您可以使用英文变量和函数名吗?不清楚您在做什么。brojac与计数器和(izdvoj'(a b(c d(e(f))的结果相同(g h)3 5 0),应该是(c d(e))(c d(e)))