2014-11-25 395 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)