2015-03-26 2 views
0

Я ищу функцию:Генерация вложенных списков Ints

def fun(init:Int,level:Int) 

Такой, что:

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

Эта задача очень проста в Java с помощью for итерации. Как я могу написать его в Scala, используя стиль функционального программирования?

+2

Вы только что полностью изменили свой вопрос, поэтому я вернул ваши изменения. Пожалуйста, задайте другой вопрос, хотите ли вы его полностью изменить? –

ответ

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)) 
} 

Но это на самом деле не рекомендуется, и будет считаться unidiomatic в большинстве сред Scala.

+0

Извините, что я действительно реализую это более сложно, и я пытаюсь перефразировать свою задачу до более общей, которая мне не удалось, поэтому я отправляю исходный вопрос сейчас –

2

Вы можете решить с помощью рекурсивной функции:

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

На каждом уровне он создает список с тем же числом элементов, как уровень с помощью функции грима объекта List. Элементы, которые вы создаете, также являются списками с одним элементом меньше текущего уровня. Конечное условие вашей функции - это когда число меньше или равно 1. Это момент, когда вы просто возвращаете список со значением init как Элемент.

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 уровню.

Смежные вопросы