2015-06-21 51 views
3

我想寫一個遞歸回文函數。代碼工作使用兩種功能如下: (設置str(ABCD))LISP - 遞歸回文

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

不過,我試圖把它合併成一個單一的功能:

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

這將返回(ABCDABCDABCDABCDDCBA)

我希望它返回的位置(abcddcba),然後最終(abcdcba)**當它顛倒時不重複最後一個字符。

我知道有更簡單的方法來做到這一點我們預定義的功能,但我試圖挑戰自己一點。不過,我卡在這裏,幫助將不勝感激。

+0

最後一個函數有一個錯誤:'str'是一個未定義的變量。 – Renzo

+0

str是早先設置的,不適合更新帖子。 – nikebOxer

回答

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

也就是說,你必須添加一個新的案例遞歸函數的終止:也終止時,有隻有一個元素,並返回該元素。

+0

謝謝,我會upvote,但我沒有聲望呢。那麼我只需要拿出評估列表的CDR來完成第二個功能,它返回A B C D C B A? – nikebOxer

+0

您對迴文的第一個定義不是遞歸的,只需將列表與其相反的列表連接起來即可解決問題。你的第二個迴文函數是遞歸的,因爲它調用它自己。這幾乎是正確的,唯一要做的就是用'(list(car l))'替換'str',因爲'str'是一個常量值(你想做迴文的列表),而在調用函數時遞歸地構建一些結構,你應該只使用參數。我想你可以將答案標記爲解決你的問題,即使你沒有upvoting的聲望,謝謝! – Renzo

+0

太棒了,我仍然對如何讓它返回感到困惑A B C D C B A.我是新的遞歸,但我知道我基本上需要把列表中的CDR附加到A B C D上嗎? – nikebOxer