不是立即解決越來越擴展您的基礎線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) takeNxs
是takeNxs
的xs
所有初始段的列表。你知道如何生成該列表嗎?
哪些候選人是真正的迴文?
現在您已經有了候選人列表,並且您知道如何檢測字符串是否是迴文,您可以刪除所有不是迴文的候選人並僅保留有效的候選人。
最小回文在哪裏?
一旦你有xs
擴展名爲palindromes,你可以簡單地選擇最小的。你完成了!
我猜是否正確取決於'makeNewPalindrome'是如何實現的! –
昨天提出了完全相同的問題(但它可能被刪除)。可能是作業或作業。你必須提供你嘗試的解決方案並解釋它出了什麼問題。 SO不是代碼寫入服務。 – Bakuriu
我認爲你最好的努力就是用'isPalindrome'開始。沒有這一點,你沒有一個可行的基礎案例,它會讓你開始解析Haskell中的文本。範圍 不: – Greg