生成Ints的嵌套列表

时间:2015-03-26 15:56:19

标签: scala functional-programming

我正在寻找一个功能:

def fun(init:Int,level:Int)

这样:

fun(1,1) == List(1)
fun(1,2) == List(List(1),List(1))

使用for迭代在java中这个任务非常简单。如何使用函数编程风格在Scala中编写它?

3 个答案:

答案 0 :(得分:2)

您可以使用List.fill。此方法的第一个参数列表具有许多可变长度的重载,并表示每个嵌套级别的元素数。第二个参数是要填充的元素:

List.fill(1, 1)(1) //List(List(1))
List.fill(1, 2, 3)(4) //List(List(List(4, 4, 4), List(4, 4, 4)))

您正在寻找的完整方法定义并不适合Scala,因为返回类型是最不常见的超级类型List[Int]List[List[Int]]List[List[List[Int]]]等,AnyList[Any],具体取决于您对fun(1, 0)的定义。它看起来像这样:

def fun(init: Int, level: Int): Any = level match {
    case 0 => init
    case n => List(fun(init, level - 1))
}

但这并不是推荐的,在大多数Scala环境中都会被认为是单一的。

答案 1 :(得分:2)

您可以借助递归函数来解决它:

def fun(init:Int, level:Int):List[_] = {
    if(level <= 1)
        List(init)
    else
        List.make(level, fun(init, level-1))
}

在每个级别,它通过使用List对象的make函数创建一个与级别相同数量的元素的列表。您正在创建的元素也是列表,其中一个元素小于当前级别。函数的结束条件是当数字小于或等于1.这就是您只需返回一个init值为Element的列表。

答案 2 :(得分:0)

类型安全方法涉及使用树,例如如下定义,

trait Tree
case class Branch(t: List[Tree]) extends Tree
case class Leaf(i: Int) extends Tree

然后例如

val tree1 = Branch(List( Branch(List(Leaf(1),Leaf(2))), Leaf(3)))

其中每个连续的Branch(List())模式对应1级别。