摘要
本文簡要介紹“分而治之”思想在 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 閱讀本書的一些想法會第一時間和大家分享