“分而治之”思想在 Scala 中的應(yīng)用

摘要

本文簡要介紹“分而治之”思想在 Scala 中的一個應(yīng)用,希望給大家一些靈感。

源自一個問題

Scala 中的 List 內(nèi)置了一個方法 ::: 來連接兩個相同類型的 List

scala> List(1,2,3) ::: List(4,5)
res2: List[Int] = List(1, 2, 3, 4, 5)

那么我們?nèi)绾巫约簛砭帉懸粋€函數(shù)實現(xiàn)該功能呢?

“分而治之”

怎么來實現(xiàn)“分而治之”呢?
這里我們使用模式匹配(pattern matching)來實現(xiàn)分的部分,然后在每個 case 的后面具體的實現(xiàn)“治”

scala> def append[T](xs: List[T], ys: List[T]): List[T] = 
     | xs match {
     | case List() => ys
     | case x :: xs1 => x :: append(xs1, ys)
     | }
append: [T](xs: List[T], ys: List[T])List[T]

append 函數(shù)的輸入?yún)?shù)是兩個 T 類型的 List(這里的 T 代表類型參數(shù),表明 List 中的元素是 T 類型的),返回的仍然是 List[T],我們對第一個 List 進(jìn)行“分”,通過 match 實現(xiàn),然后對每種匹配到的情況進(jìn)行“治”,如果是空的 List 那么直接返回第二個傳進(jìn)來的 List;如果匹配到的是 x :: xs1,即 T 類型的 x 和一個 List[T] 連接形成的 List[T](例如 1::List(2,3) 的結(jié)果就是 List(1,2,3)),就返回 x :: append(xs1, ys) ,即遞歸調(diào)用

scala> append(List(1,2,3), List(4,5))
res4: List[Int] = List(1, 2, 3, 4, 5)

實際的實現(xiàn)過程其實是:

1 :: 2 :: 3 :: List(4, 5)  // 1 :: (2 :: (3 :: List(4, 5)))  括號可以省略

至此,我們使用模式匹配簡單的實現(xiàn)了這種“分而治之”的思想

總結(jié)

希望該思想能夠幫助大家解決實際編程中遇到的類似問題,當(dāng)然不限于您使用的是哪種變成語言

本文參考:Programming in Scala, 3rd Edition 16.6 FIRST-ORDER METHODS ON CLASS LIST 閱讀本書的一些想法會第一時間和大家分享

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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