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

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

我想用一个“功能”风格来写这个简单的算法,使用像map(),count()等Kotlin的操作符。我能想到的最接近的是:

 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传递的代码来计算的(它在前一个元素上被调用,只有当另一个项目被查询时,也就是懒洋洋地)。