我有一个应该采用任何列表的函数,然后像这样打印(例如):
输入列表:(A B C)
输出:(A B C) (A) (B) (C)
这是原始列表,后面跟着它自己列表中的每个元素。该函数应该写成递归函数。
我有以下伪代码,我无法正确使用,无法转换为递归:
Assuming input (A B C)
Function input (list)
Cons newlist '(list) //newlist = (A B C)
newlist append (car list) //car returns A
pop list//remove firstElement
newlist append (car list)//car returns B
Pop list
newlist append (car list)//car returns C
pop list
Print newlist.
这里的问题是使用Append,我会得到(A B C A B C)。有没有其他方法可以将它分成各自的括号并递归?
答案 0 :(得分:1)
你可以选择这样的东西:
(defun f (lst)
(labels
((g (lst)
(when lst
(cons (list (car lst)) (g (cdr lst))))))
(cons lst (g lst))))
其中外部函数f
使用内部递归函数g
并在初始列表前面添加。
? (f '(A B C))
((A B C) (A) (B) (C))
基本上g
与mapcar
相同,所以,如果您不必递归,则可以改为:
(defun f (lst)
(cons lst (mapcar #'list lst)))
答案 1 :(得分:-2)
这是你的逃生航天飞机,Sigourney :)
(使用复古的GNU常见LISP窗口构建测试 - 我不得不手动重新键入会话,因为当编译此东西时,复制粘贴仍然是科幻概念)
>>(defun explode_list (input)
(if (null input)
nil ; list termination
(cons
(list (first input)) ; create singleton list with first element
(explode_list (rest input)) ; concatenate with the rest of the list
)))
EXPLODE_LIST
>> (explode_list '(a b c))
((A)(B)(C))
>>(defun do_weird_thing_with_a_list (l) (cons l (explode_list l)))
DO_WEIRD_THING_WITH_A_LIST
>> (do_weird_thing_with_a_list '(a b c))
((A B C) (A) (B) (C))