如何编写递归函数并在Lisp中打印它

时间:2014-12-13 21:41:34

标签: lisp common-lisp

我有一个应该采用任何列表的函数,然后像这样打印(例如):

输入列表:(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)。有没有其他方法可以将它分成各自的括号并递归?

2 个答案:

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

基本上gmapcar相同,所以,如果您不必递归,则可以改为:

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