2016-02-04 3 views
-1

Я пытаюсь создать список в scala, который дал бы данные (длина и функция), результатом будет список от 0 до этой длины-1.Ошибка в логике рекурсивного списка

, например:

listMaker(3,f) = List(0,1,2) 

до сих пор я создал вспомогательный класс, который принимает 2 int и возвращает list в этом диапазоне.

функция listMaker выглядит следующим образом:

def listMaker[A](length:Int, f:Int =>A):List[A] = length match{ 
    case 0 => List() 
    case _ => listMaker(length,f) 
} 

моя f функция просто принимает переменную х и возвращает следующее:

def f(x:Int)=x 

комментарий ниже имеет смысл, но он по-прежнему получает меня ошибки , Я думаю, что отредактированный код - это более простой способ получить, где бы я хотел:

Однако теперь я получаю бесконечный цикл. Какую часть логики мне не хватает?

+0

Ваша функция arg, 'f' утверждает, что она принимает' Int' и возвращает 'A'. Вы пытаетесь вызвать 'f', переданный в результате' listHelper', который вы указали, возвращает 'List [Int]'. Вы пытаетесь предоставить «List [Int]» в функцию, которую вы определили как принимающую «Int», следовательно, несоответствие типа – cmbaxter

+0

. Как вы думаете, что делает ненулевой случай? Вам нужно вызвать f с целым числом и добавить его в список длины 'length-1'. Вместо этого вы просто вызываете себя рекурсивно с теми же аргументами => бесконечный цикл –

+0

«Однако теперь я получаю пустой список в качестве возврата». Код в вашем вопросе, поскольку я пишу это, НЕ дает пустой список, но бесконечно петли , Таким образом, вы не используете этот код. Мы не можем догадаться, какой код вы используете, поэтому мы не можем сказать, что вы пропустили. –

ответ

2

Рекурсивная функция обычно должна постепенно «откусить» части входных данных, пока не останется ничего - иначе она никогда не сможет прекратиться.

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

def listMaker[A](length:Int, f:Int =>A):List[A] = length match{ 
    case 0 => List() 
    case _ => listMaker(length,f) 
} 

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

(Есть и другие проблемы: вам нужно создать свой список результатов, когда вы рекурсируете, но ваш текущий код просто возвращает пустой список. Я предполагаю, что это учебное упражнение, поэтому я не поставляю рабочий код. ..).

+0

У меня есть вспомогательный метод, который принимает два int и выводит список. Я считаю, что я должен работать в этой функции. У меня возникают трудности с тем, что listMaker принимает f как параметр. – user5881303

+0

Да, это учебное упражнение. Я просто пытаюсь выбрать новые навыки программирования. – user5881303

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