haskell 基礎題解(32)

2021-09-26 03:55:23 字數 798 閱讀 8881

【題目】從若干個字母中取出n個字母(順序無關),列出所有的取法。

比如,「abc」 中取出2個字母:「bc」,「ac」,「ab」

這個問題有很通用的意義。重要。

還是按遞迴的想法: 「abcde…」 中取出 n 個,分為兩個子任務:結果中要麼包含a,要麼不包含a。若包含a,則只要在剩個的字母中取n-1個,若不包含a,則在剩個的字母中仍取n個。

上**:

----組合問題

combina :: int

->

[a]-

>

[[a]

]combina 0 _ =[[

]]combina _ =

combina n (x:xs)

= combina n xs +

+[ x:ys | ys <

- combina (n-

1) xs]

main =

doprint $ combina 3

"abcd"

print $ combina 2

"ab"

注意這裡的遞迴邊界條件。要仔細考慮。

無論在多少個東西中取0個,是有解的。這個解就是什麼都不取,但它是乙個解。

在空集中取大於0個東西,是無解的。因為無論如何都無法完成任務。

從實用角度講,如果實在拿不準邊界,寧可保守一點。比如,考慮取1個,或集合中只有乙個無素的情況,都要容易得多。

問題還沒有結束。如果存在重複無素該怎麼處理呢?

我有乙個想法。。。。。嗯,過幾天再補在這裡。

(待續)

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