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)
由于您不知道将有多少项目,您可以构建一个(可能是无限的)序列,其中每个项目都是根据前一个项目计算的,然后根据您的条件限制它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传递的代码计算(它在前一个元素上调用,并且仅在查询另一个项目时,即懒惰).
| 归档时间: |
|
| 查看次数: |
485 次 |
| 最近记录: |