haskell基礎題解(14)

2021-09-25 19:02:02 字數 1436 閱讀 5519

【題目】用自然數蛇形填充乙個 n 階的方陣。當n=5時,形如:

這個問題用 haskell 解決時與【題目13】差別甚微。

實際上,從函式式的思考習慣看,只要讓有些行作成後反轉一下就可以了。

上**:

ju n = [ f x | x<

-[0..n-

1] ] where

f row | even row = take n [row*n+

1..]

| odd row = reverse . take n $ [row*n+

1..]

bu :

:int

->

string

->

string

bu n s =

let x =

length

(show (n*n)

) y =

length s

in replicate (x-y) ' ' +

+ sok :

:int

-> [string]

ok n = map (unwords . map (bu n . show)

)(ju n)

main = putstrln $ unlines (ok 5

)

$ 在 haskell 中的定義很有意思。

f $ x = f x

這有用?? 是的,雖然還是呼叫函式,但 $ 的優先順序最低。可以避免我們用太多的括號,使人眼花。

reverse . take n $ [row*n+1..]的意思是:

(reverse . take n) [row*n+1..]

再結合 (.)的定義,上式等價於:

reverse (take n [row*n+1..])

函式的定義後用豎線,表示後面要跟乙個限定條件,滿足後才匹配。

一般是多個條件,最好能全覆蓋,所以,最後乙個條件一般都是 otherwise,實際上就是true

因而,也可以這麼寫:

f row | even row  = take n [row*n+

1..]

| otherwise = reverse . take n $ [row*n+

1..]

或者:

f row | even row  = take n [row*n+

1..]

| true = reverse . take n $ [row*n+

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 基礎題解(15)

題目 用自然數以螺旋的方式填充乙個nxn的方陣。當n 5時,形如 這個問題對函式式語言是有點小難度。如果是命令式的,可以建乙個陣列,不斷地賦值,改變陣列的狀態,最後把陣列裝滿了就ok。但函式式風格沒有狀態,沒有賦值,只有定義而已。如果仍堅持仿照命令式風格,也可以做。用乙個函式,接受舊陣列,要填入的數...