2015-11-03 17 views
-5

在Haskell中我想創建一個函數formPalindrome,它接收一個字符串並返回可能的最短迴文,輸入字符串作爲字符串的開始。使用Haskell從基本字符串構建迴文

例如:

formPalindrome 「sun」 ⇒ 「sunus」 

formPalindrome 「level」 ⇒ 「level」 

到目前爲止,我有以下幾點:

formPalindrome :: String -> String 
formPalindrome x 
| isPalindrome x = x 
| otherwise  = makeNewPalindrome x 

是不是?

+2

我猜是否正確取決於'makeNewPalindrome'是如何實現的! –

+0

昨天提出了完全相同的問題(但它可能被刪除)。可能是作業或作業。你必須提供你嘗試的解決方案並解釋它出了什麼問題。 SO不是代碼寫入服務。 – Bakuriu

+0

我認爲你最好的努力就是用'isPalindrome'開始。沒有這一點,你沒有一個可行的基礎案例,它會讓你開始解析Haskell中的文本。範圍 不: – Greg

回答

1

不是立即解決越來越擴展您的基礎線xs最短迴文(或者,如果我們把它作爲一個字符列表,x_0, ..., x_n)的問題,您可能希望通過小步驟進行:

迴文是什麼?

迴文是一個字符串,我們可以從左到右和從右到左閱讀,沒有任何區別。我們可以表達簡明,而使用reverse

isPalindrome :: String -> Bool 
isPalindrome xs = xs == reverse xs 

哪些候選人?

我們正在尋找x_0, ..., x_n的擴展名,看起來有點像palindromes。我們可以肯定地說:

  • 如果xs本身就不是一個迴文然後x_0, ..., x_n, x_0是一個更接近是一個:讀它從左到右或從右到左,他們都開始與字符x_0

  • 如果x_0, ..., x_n, x_0不是迴文然後x_0, x_1, ..., x_n, x_1, x_0是一個更接近是一個:讀它從左到右或從右到左,他們都開始x_0其次x_1

  • 等,爲x_0, ..., x_n, x_2, x_1, x_0和所有像x_0, ..., x_n, x_k, x_(k-1), ..., x_0

我們知道,xs ++ reverse xs保證是迴文,所以我們只對考生產生小於列表感興趣的字符串:

[ xs 
, xs ++ reverse (take 1 xs) 
, xs ++ reverse (take 2 xs) 
, xs ++ reverse (take 3 xs) 
, (...) 
, xs ++ reverse xs ] 

其可被寫成:其中map (\ ys -> xs ++ reverse ys) takeNxstakeNxsxs所有初始段的列表。你知道如何生成該列表嗎?

哪些候選人是真正的迴文?

現在您已經有了候選人列表,並且您知道如何檢測字符串是否是迴文,您可以刪除所有不是迴文的候選人並僅保留有效的候選人。

最小回文在哪裏?

一旦你有xs擴展名爲palindromes,你可以簡單地選擇最小的。你完成了!

+0

*主要> formPalindrome 「太陽」 :2:1'formPalindrome ' 也許你的意思是'isPalindrome'(第28行) 我得到這個! – TheProgrammer