我正在寻找一个功能:
def fun(init:Int,level:Int)
这样:
fun(1,1) == List(1)
fun(1,2) == List(List(1),List(1))
使用for
迭代在java中这个任务非常简单。如何使用函数编程风格在Scala中编写它?
答案 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]]]
等,Any
或List[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
级别。