2013-10-11 4 views
0

Ниже приведен простой метод «повторения», который я пытаюсь написать с помощью хвостовой рекурсии. Единственная цель этой функции состоит в том, чтобы просто повторить заданную строку обратно назад «n» количество раз.Ошибка рекурсии скалы

I.e. repeat («Hello», 3) = «HelloHelloHello»

Но по какой-то причине я получаю «java.lang.UnsupportedOperationException», и я не уверен, почему.

P.S. Это домашнее задание, поэтому, если бы я мог просто указывать в правильном направлении, а не на прямой ответ, это было бы круто!

def repeat(s: String, n: Int): String = { 
    def tailRepeat(str: String, x: Int): String = x match { 
     case `n` => str 
     case _ => val repeatString = s + str 
     tailRepeat(repeatString, (x + 1)) 
    } 
    tailRepeat(s, 0) 
    } 
+0

В какой строке вы выбрали исключение? Вы уверены, что это в этом коде? Кажется, он компилируется и выполняется (в основном) отлично для меня - просто ошибка «один за другим» ('repeat (« Hello », 3)« дает »HelloHelloHelloHello» для меня). – Shadowlands

+0

Ya, Он выбрасывал эту ошибку на линии, где повторение в порядке. Но я только что вернулся к нему, и теперь он работает. Я действительно чувствую себя глупо, как сейчас, но я не знаю, что я сделал, чтобы заставить его работать. Поскольку я ничего не изменил. – Scalahansolo

ответ

3

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

def repeat(s: String, n: Int): String = { 
    def tailRepeat(str: String, x: Int): String = { 
     if(x == 0) str 
     else  tailRepeat(str + s, x - 1) 
    } 
    tailRepeat(s, n - 1) 
} 

println(repeat("hello", 3)); 
// hellohellohello 
+1

Я не тестировал это решение, но единственная проблема с этим заключается в том, что если использование переходит в «0» для количества повторов, это не сработает. Я думаю, что это просто нужно было изменить так легко, чтобы рассчитывать на этот край. – Scalahansolo

+0

очень верно, приятно поймать; но общая идея остается прежней. –

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