05 遞歸

Haskell 中沒有 forwhile 循環(huán)喜滨,而使用遞歸解決循環(huán)問題扶叉。

所謂遞歸,就是將一個(gè)大問題分解為兩部分

  • 先取出容易解決的一小部分進(jìn)行處理
  • 剩余部分作為同樣的問題處理,但是規(guī)模變小了一點(diǎn)
  • 問題的規(guī)模越來(lái)越小谣拣,直到遇到退出條件

這里的重點(diǎn)是囚痴,將剩余部分作為同樣問題處理的時(shí)候叁怪,在語(yǔ)義上我們認(rèn)為他已經(jīng)解決了,可以將其當(dāng)做一個(gè)確定的值參與到運(yùn)算中

實(shí)作 Maximum

遞歸配合模式匹配和解構(gòu)深滚,非常容易實(shí)現(xiàn)

  • 第一個(gè)模式是錯(cuò)誤參數(shù)
  • 第二個(gè)模式是退出條件
  • 第三個(gè)模式將問題進(jìn)行了分解
maximum' :: (Ord a) => [a] -> a  
maximum' [] = error "maximum of empty list"  
maximum' [x] = x  
maximum' (x:xs)   
    | x > maxTail = x  
    | otherwise = maxTail  
    where maxTail = maximum' xs

上面的代碼用 where 定義了一個(gè)局部函數(shù)來(lái)比較當(dāng)前值和剩余部分的大小奕谭,使用 max 函數(shù)可以進(jìn)一步簡(jiǎn)化代碼。

這里可以看出: max 函數(shù)將剩余問題當(dāng)做了一個(gè)值參與了運(yùn)算

maximum' :: (Ord a) => [a] -> a  
maximum' [] = error "maximum of empty list"  
maximum' [x] = x  
maximum' (x:xs) = max x (maximum' xs)

幾個(gè)常用遞歸函數(shù)

replicate

返回一個(gè)包含多個(gè)重復(fù)元素的列表, 如 replicate 3 5 回傳 [5,5,5]

同樣可以看到:剩余部分的遞歸同樣被當(dāng)做了一個(gè)值傳遞給了 : 函數(shù)參與運(yùn)算

replicate' :: (Num i, Ord i) => i -> a -> [a]  
replicate' n x  
    | n <= 0    = []  
    | otherwise = x:replicate' (n-1) x

take 函數(shù)

從一個(gè)列表中取出一定數(shù)量的元素痴荐。 如 take 3 [5,4,3,2,1], 得 [5,4,3]

take' :: (Num i, Ord i) => i -> [a] -> [a]  
take' n _  
    | n <= 0   = []  
take' _ []     = []  
take' n (x:xs) = x : take' (n-1) xs

reverse 函數(shù)

反轉(zhuǎn)一個(gè) List

reverse' :: [a] -> [a]  
reverse' [] = []  
reverse' (x:xs) = reverse' xs ++ [x]

repeat 函數(shù)

取一個(gè)元素作參數(shù), 回傳一個(gè)僅包含該元素的無(wú)限 List

repeat' :: a -> [a]  
repeat' x = x:repeat' x

zip 函數(shù)

取兩個(gè) List 作參數(shù)血柳,將他們組合成一個(gè)序?qū)Φ牧斜怼?code>zip [1,2,3] [2,3] 回傳 [(1,2),(2,3)]

  • 它會(huì)把較長(zhǎng)的 List 從中間斷開, 以匹配較短的 List
  • zip 處理一個(gè) List 與空 List 會(huì)得一個(gè)空 List,這是退出條件
zip' :: [a] -> [b] -> [(a,b)]  
zip' _ [] = []  
zip' [] _ = []  
zip' (x:xs) (y:ys) = (x,y):zip' xs ys

elem 函數(shù)

它檢測(cè)一個(gè)元素是否在一個(gè) List

elem' :: (Eq a) => a -> [a] -> Bool  
elem' a [] = False  
elem' a (x:xs)  
    | a == x    = True  
    | otherwise = a `elem'` xs

快速排序

快速排序是一個(gè)經(jīng)典排序算法生兆,非衬寻疲快,其算法描述也非逞荒眩“遞歸”

算法描述:

  • 取出頭部項(xiàng)(已解決的一小部分)
  • 將所有小于等于頭的項(xiàng)放在一組根吁,并將其快速排序(即作為剩余問題解決)
  • 將所有大于頭的項(xiàng)放在一組,并將其快速排序(即作為剩余問題解決)
  • 將小組合蔽、頭击敌、大組組合起來(lái)即可(即將各個(gè)部分看做已解決的值參與運(yùn)算)
quicksort :: (Ord a) => [a] -> [a]  
quicksort [] = []  
quicksort (x:xs) =  
  let smallerSorted = quicksort [a | a <- xs, a <= x] 
      biggerSorted = quicksort [a | a <- xs, a > x]  
  in smallerSorted ++ [x] ++ biggerSorted
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拴事,隨后出現(xiàn)的幾起案子沃斤,更是在濱河造成了極大的恐慌,老刑警劉巖挤聘,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轰枝,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡组去,警方通過查閱死者的電腦和手機(jī)鞍陨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人诚撵,你說(shuō)我怎么就攤上這事缭裆。” “怎么了寿烟?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵澈驼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我筛武,道長(zhǎng)缝其,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任徘六,我火速辦了婚禮内边,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘待锈。我一直安慰自己漠其,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布竿音。 她就那樣靜靜地躺著和屎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪春瞬。 梳的紋絲不亂的頭發(fā)上柴信,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音宽气,去河邊找鬼颠印。 笑死,一個(gè)胖子當(dāng)著我的面吹牛抹竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播止潮,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼窃判,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了喇闸?” 一聲冷哼從身側(cè)響起袄琳,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎燃乍,沒想到半個(gè)月后唆樊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刻蟹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年逗旁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡片效,死狀恐怖红伦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情淀衣,我是刑警寧澤昙读,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站膨桥,受9級(jí)特大地震影響蛮浑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜只嚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一沮稚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧介牙,春花似錦壮虫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至线得,卻和暖如春饶唤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贯钩。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工募狂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人角雷。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓祸穷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親勺三。 傳聞我的和親對(duì)象是個(gè)殘疾皇子雷滚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容