haskell 基礎題解(36)

2021-09-26 05:07:59 字數 930 閱讀 7632

【題目】映象串也叫「回文串」,這種串是首尾對稱的,也就是說,正讀倒讀都一樣。

給你乙個串,至少要新增多少個字母,才能成為映象串呢?

比如: 「abb」 需要添乙個。「ababcabc」 則需要添3個。

(注意,可以任意位置添字母,不侷限於首尾)

這個問題初看起來沒什麼頭緒,因為哪都能添,太靈活,可能性太多。但如果用遞迴的思考方法就會另一番景象了。

考慮乙個映象串的首尾字母必然是相同的。如果不同,那麼無論如何都必須在首或尾添乙個。這步是繞不過去的。那我們何不就先做這步?然後呢? 剩下的那個串如果知道最少要加多少,那問題不就是它說的數再加1嗎?

上個**:

tomirror :: string -

>

inttomirror ""=0

tomirror [_]=0

tomirror s | head s =

=last s = tomirror . init . tail $ s

| otherwise =

let n1 = tomirror (tail s)

n2 = tomirror (init s)

in min n1 n2 +

1 main :: io (

)main =

doprint $ tomirror "abc"

print $ tomirror "aba"

print $ tomirror "abb"

print $ tomirror "abababc"

print $ tomirror "ababcabc"

如果,首尾同,則問題變成中間的串的最小新增。

如果不同,有兩種變成相同的方法,要分別考慮哪個更優。

另外,首尾同的情況下,如果仍在外層新增,是否會得到更優的解呢?這個可以去證明不可能更優。(此處略。。。)

haskell 基礎題解(06)

題目 如果乙個數的所有真因子 不包含它自身的因子 之和恰等於其自身,則該數為完全數,也稱為完美數 perfect number 完全數有許多奇妙的性質。但它們很稀少,你來求前幾個吧。最小的乙個是 6,因為 6 1 2 3 這個完全數的定義已經很清楚了,如果沒有什麼妙法,就地毯式搜尋也可以。下法就是 ...

haskell 基礎題解(07)

題目 11 1 1 2 1 1 3 3 1 1 4 6 4 1 這個陣勢叫楊輝三角,國外叫帕斯卡三角。前一行的數字中,每兩個相鄰的數字相加就得到下一行的數字。左右兩邊的數永遠是 1 寫個程式,輸出前幾行的楊輝三角。import data.list intersperse yang hui int y...

haskell基礎題解(14)

題目 用自然數蛇形填充乙個 n 階的方陣。當n 5時,形如 這個問題用 haskell 解決時與 題目13 差別甚微。實際上,從函式式的思考習慣看,只要讓有些行作成後反轉一下就可以了。上 ju n f x x 0.n 1 where f row even row take n row n 1.odd...