2014-11-25 402 views
1

我被給了這個問題,我想我已經想通了,但我被告知我錯了。問題是,。給定一個列表xs,顛倒前n個元素。我想我不明白這個問題在問什麼,我認爲我們接受一個I​​nt n,然後返回該int n前面的前n個元素。n個元素的反向列表

def nthRev[T](n: Int,xs: List[T]): List[T] = xs match { 
    case List() => List() 
    case head :: rest => (head::rest.take(n)).reverse 
} 

因此,輸出

nthRev(3,List(1, 2, 3, 4, 5)) 

回報

List(4, 3, 2, 1) 

,但顯然它的錯,誰能解釋一下這個問題是要求?

+1

什麼是你想用這個模式來完成?對我而言,如果列表爲空,這看起來就像一個測試。沒有其他的。對於這個問題本身,我想結果應該是'List(4,3,2,1,5)'。 – bash0r 2014-11-25 01:06:53

回答

3

我理解你的問題的方式「給定一個列表XS,扭轉前n個元素。」而例如

nthRev(3,List(1, 2, 3, 4, 5)) 

我希望它扭轉了前3個元素,但隨後離開該列表的其餘部分:

List(3, 2, 1, 4, 5) 

當問題說:「前n個元素」跟它用你的例子「3」中第一個參數給出的數字替換「n」,給出「前3個元素」。 3與列表中的元素無關。改變你的例子:

nthRev(3,List(10,11,12,13,14) 

將返回

List(12,11,10,13,14) 
+0

上帝,我終於看到它了,非常感謝你! – 2014-11-25 02:00:47

+0

很高興它有幫助。 – 2014-11-26 17:04:43

3

我認爲這意味着你應該返回一個新的列表,它與原始列表中的元素相同,但是第一個元素是相反的。

def nthRev[T](n: Int, xs: List[T]): List[T] = 
    xs.splitAt(n) match { case (a, b) => a.reverse ::: b } 

nthRev(3, (1 to 5).toList) // List(3, 2, 1, 4, 5)