LISP - 递归回文

时间:2015-06-21 13:25:49

标签: recursion lisp common-lisp palindrome

我正在尝试写一个递归回文函数。代码使用两个函数如下:     (设置(defun reverseString (l) (cond ( (null l) nil) (T (append (reverseString (cdr l)) (list (car l)))) ) ) (defun palindrome (l) (cond ( (null l) nil) (T (append l(reverseString (cdr l)) (list (car l)))) ) ) (a b c d))

(defun palindrome (l)
    (cond
        ( (null l)
                nil
        )
        (T 
            (append str(append (palindrome (cdr l)) (list (car l))) )
        )
    )
)

但是,我正在尝试将它组合成一个函数:

{{1}}

返回(A B C D A B C D A B C D A B C D D C B A)

我希望它返回(a b c d d c b a)然后最终(a b c d c b a)**在反转时不重复最后一个字符。

我知道有更简单的方法可以做到这一点我们预定义的功能,但我试图挑战自己一点。但是我被困在这里,非常感谢帮助。

1 个答案:

答案 0 :(得分:3)

这是一个递归的单函数回文:

(defun palindrome(l)
  (cond ((null l) nil)
        (t (append (list (car l)) (palindrome (cdr l)) (list (car l))))))

递归以这种方式构成:对列表的其余部分做一个回文,并在列表的第一个元素的开头和结尾放置。

如果您只想让中心元素使用一次,则可以使用以下替代版本:

(defun palindrome(l)
  (cond ((null l) nil)
        ((null (cdr l)) (list (car l)))
        (t (append (list (car l)) (palindrome (cdr l)) (list (car l))))))

也就是说,你必须为递归函数的终止添加一个新的case:当只有一个元素时终止,并返回该元素。