Kotlin - 将while循环转换为功能样式

Tia*_*ago 5 functional-programming while-loop kotlin

我有以下Kotlin功能:

fun func(n: Int): Int {

    var count = 1

    var m = n
    while(m != 1) {

        m = if(m.isOdd()) 3 * m + 1 else m / 2

        count++
    }

    return count
}
Run Code Online (Sandbox Code Playgroud)

我想用"功能"风格编写这个简单的算法,使用Kotlin的运算符,如map(),count()等.我能想出的最接近的是:

fun func(n: Int): Int {

    return n.toList()
            .map{ if(it.isOdd()) 3*it+1 else it/2 }
            .takeWhile { it != 1 }
            .count()

}
Run Code Online (Sandbox Code Playgroud)

显然,上面的代码不起作用,因为map只执行一次,但你知道我想要实现的目标.

PS:toList()只是一个扩展函数,它将int转换为包含该int的列表:

fun Int.toList() = listOf(this)
Run Code Online (Sandbox Code Playgroud)

hot*_*key 7

由于您不知道将有多少项目,您可以构建一个(可能是无限的)序列,其中每个项目都是根据前一个项目计算的,然后根据您的条件限制它it != 1并计算有多少项目:

return generateSequence(n) { if (it.isOdd()) 3 * it + 1 else it / 2 }
        .takeWhile { it != 1 }
        .count()
Run Code Online (Sandbox Code Playgroud)

这里,generateSequence(n) { ... }构造一个Sequence<Int> 具有n第一个元素的元素,并且每个以下元素由作为lambda传递的代码计算(它在前一个元素上调用,并且仅在查询另一个项目时,即懒惰).