Причина, по которой он не работает, заключается в том, что когда вы вызываете рекурсивный метод, он в конечном итоге возвращает свой результат. Код, удаляющий двойной пробел, не сохраняет этот результат.
if (song.contains(" ")) {
val e = song.indexOf(" ")
songDecoder(song.patch(e,Nil,1)) //send patched song to decoder
} //don't save returned string
//continue with unpatched song
Второй блок if
также повторяется без сохранения результата.
if (l==0) {
val c = song.patch(l,Nil,3)
songDecoder(c) //send patched song to decoder
} //don't save returned string
//continue with unpatched song
Вы можете удалить оба из этих if
блоков, и вы получите те же результаты от вашего метода. Единственный код, который влияет на вывод, является окончательным if
/ else
, и это потому, что он находится в конце блока кода метода. Поэтому, что бы if
/ else
не выдало, метод возвращает.
if (l== -1)
song.trim //return the final result string
else {
val c = song.patch(l,Nil,2) //remove one WUB
val b = c.patch(l," ",1) //replace with space
songDecoder(b) //return whatever the next recursion returns
}
Так же, как и к вашему сведению, здесь другой подход.
def songDecoder(song:String):String =
"(WUB)+".r.replaceAllIn(song, " ").trim