gpt4 book ai didi

while-loop - Kotlin - 将 while 循环转换为函数式样式

转载 作者:IT老高 更新时间:2023-10-28 13:47:31 26 4
gpt4 key购买 nike

我有以下 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
}

我想以“函数式”风格编写这个简单的算法,使用 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()

}

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

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

fun Int.toList() = listOf(this)

最佳答案

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

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

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

关于while-loop - Kotlin - 将 while 循环转换为函数式样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724764/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com