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