Scalaの末尾再帰(tailrec)のサンプルコード - QiitaをKotlinに翻訳したもの。
interface Node
data class Directory(val name: String, val children: List<Node> = listOf()) : Node
data class File(val name: String) : Node
val fileTree =
Directory("Users", listOf(
Directory("alice", listOf(
File(".bashrc"),
Directory(".Trash"),
Directory("Desktop", listOf(
File("photo.jpg"),
File("document.docx"),
File("spreadsheet.xlsx")
))
))
))
tailrec fun flattenFilesytem(tree: List<Node>, filenames: List<String> = listOf()): List<String> {
val first = tree.firstOrNull()
val rest = tree.drop(1)
return when (first) {
is File -> flattenFilesytem(rest, filenames.plus(first.name))
is Directory -> flattenFilesytem(rest + first.children, filenames.plus(first.name))
else -> filenames
}
}
flattenFilesytem(listOf<Node>(fileTree))
//=> res27: kotlin.collections.List<kotlin.String> = [Users, alice, .bashrc, .Trash, Desktop, photo.jpg, document.docx, spreadsheet.xlsx]