2016-02-04 3 views
1

Как написать функцию, которая строит список данной длины. Каждый элемент определяется путем применения п к индексу элемента:Задача при построении списка в scala рекурсивно

def buildList[A](length: Int, f: Int => A): List[A] 

тест был бы что-то подобное:

test("test") { 
def f(x: Int) = x 
assert(buildList(10, f) == List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)) 

Так входной пример будет listBuild (10, е) = выход Список (0, .... 9)

Я знаю, как это сделать в OOL, но функционирование программирования для меня несколько новое.

Любые идеи о том, как это сделать? По крайней мере, псевдокод поможет ..

PS: Это не HW. Я пытался научить себя scala, и это функция, с которой я боролся ...

+1

'Я пытался научить себя Scala, и это функция, с которой я боролся ... ' Продолжайте движение - я помню, как стукнула головой о стену, когда училась сгибать 2 года назад. –

+1

« Это не HW ». Если вы так выразились, но это странно, что (по крайней мере) два из вас задали вопросы о такой же функции сегодня: http://stackoverflow.com/questions/35204312/error-in-recursive-list-logic –

+1

'Список. tabulate (length) (f) 'именно то, что вы хотите. Но я понимаю, что нужно написать сам –

ответ

0
  1. k является Целочисленным и никогда не будет соответствовать пустому списку Nil.
  2. Вот ваша функция, используйте "buildLister"

    Защиту listBuilder [A] (к: Int, F: Int => A): Список [A] = если (к < 0) Nil еще f (k) :: listBuilder (k-1, f)

    def buildLister [A] (k: Int, f: Int => A): Список [A] = listBuilder (k-1, f) .reverse

+0

, который помогает. Я переделаю вопрос. Может быть, это немного более понятно ... –

+0

У вас есть 'buildLister' и' listBuilder'. Один из них - ошибка! –

+0

@TheArchetypalPaul опечатка исправлена ​​ –

0
scala> def buildHelper(x: Int): List[Int] = 
    | if (x < 0) List() else x :: buildHelper(x-1) 
buildHelper: (x: Int)List[Int] 

scala> def buildList(x: Int): List[Int] = 
    | ??? 
buildList: (x: Int)List[Int] 

Implemen тации для buildList (прокручивать над ней, чтобы увидеть его, - но я хотел бы попробовать сначала реализовать его по своему усмотрению):

buildHelper (х) .reverse

scala> buildList(10) 
res2: List[Int] = List(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
+0

Это не использует функцию 'f'. –

2

Здесь не рекомендуется использовать рекурсию. Вы можете получить последовательность, содержащую индексы, с помощью Range. Применение функции к каждому элементу коллекции называется map. Сочетание двух дает:

0 until length map f 
+0

'« Предпочтительно не использовать рекурсию здесь ».« Также желательно, чтобы я объяснил, почему «рекурсия» не должна быть явно использована. –

+0

Это вопрос читаемости и идиоматический стиль функционального программирования. Рекурсия используется только тогда, когда другие методы либо невозможны, либо гораздо менее ясны. –

+0

Конечно, Карл. Мне кажется, что в контексте кого-то, изучающего строительные блоки функционального программирования, прыжок прямо к функции более высокого порядка (например, 'до') не помогает. Я считаю, что лучше реализовать нерегулярное рекурсивное решение. Затем напишите хвостовое рекурсивное решение, а затем используйте 'fold'. Наконец, если возможно, пропустите «свернуть», используя только функции более высокого порядка, такие как 'filter',' sum' и т. Д. –

0

построения списка в Скале рекурсивно

Вы можете попробовать что-то вроде этого:

object UtilList { 

    def build[A](length: Int, f: Int => A): List[A] = { 
    val list: List[A]= List() 

    @annotation.tailrec 
    def foo(list: List[A], index: Int, f: Int => A): List[A] = { 
     if (index == length) list 
     else foo(f(index) :: list, index + 1, f) 
    } 
    foo(list, 0, f) 
    } 
} 
Смежные вопросы