首先,你要split
返回一對列表,因此,返回類型必須(List[Int], List[Int])
。但是,一起使用對和列表通常意味着經常分解返回值。你可能想要有一個輔助功能爲你做繁重的工作。
例如,您的輔助功能可能會給出兩個列表,最初爲空,並建立內容,直到第一個列表爲空。結果將是這對清單。
在遞歸函數設計中,您必須決定的下一件事是「什麼是關鍵決策?」在你的情況下,它是「價值不大於p」。這導致以下代碼:
def split(p:Int, xs: List[Int]): (List[Int], List[Int]) = {
def splitAux(r: List[Int], ngt: List[Int], gt: List[Int]): (List[Int], List[Int]) =
r match {
case Nil => (ngt, gt)
case head :: rest if head <= p =>
splitAux(rest, head :: ngt, gt)
case head :: rest if head > p =>
splitAux(rest, ngt, head :: gt)
}
val (ngt, gt) = splitAux(xs, List(), List())
(ngt.reverse, gt.reverse)
}
倒車的步驟並不是嚴格必要的,但可能並不令人驚訝。同樣,第二個後衛謂詞明確了正在採取的路徑。
但是,有一種更簡單的方法:使用內置函數。
def split(p:Int, xs: List[Int]): (List[Int], List[Int]) = {
(xs.filter(_ <= p), xs.filter(_ > p))
}
filter
只提取符合標準的項目。此解決方案遍歷列表兩次,但由於您在之前的解決方案中擁有reverse
步驟,因此無論如何您都要這樣做。
你明白算法嗎? – justanothercoder
如果要遞歸執行此操作,請在函數內引入簽名splitHelper(p:Int,input:List,greater:List,noGreater:List)的幫助器函數:(List,List)。顯然列出[Int]無處不在。幫助函數只能調用自己或返回結果。通過調用實現你的主函數:splitHelper(p,xs,Nil,Nil) – ponythewhite