作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个函数,该函数生成长度为n的所有可能排列,其中列出的对象是从集合S中非穷举地获取的。我正在尝试以Kotlin的功能风格实现此目的。
这是与此处的Python相同的问题:Generating permutations of a given length - Python
提供的答案是特定于Python的,因此对我没有帮助。
我也发现了这一点:
https://discuss.kotlinlang.org/t/cartesian-products/343
但是很难理解这是否是我要尝试做的事情。
我已经编写了一个接近完成任务的函数,但是它返回长度<= n的所有非穷举排列,这不是我想要的。这是代码:
fun <T> nonexhaustivePermutations(length: Int, components: List<T>): List<List<T>>{
return if (components.isEmpty() || length <= 0 ){
listOf(listOf())
}else{
components.map { x -> nonexhaustivePermutations(length-1, components)
.map { y -> listOf(x) + y } }
.fold(listOf(listOf()), { x, y -> x + y} )
}
}
最佳答案
您可以这样操作:
fun <T> nonexhaustivePermutations(length: Int, components: List<T>): List<List<T>> =
if (components.isEmpty() || length <= 0) listOf(emptyList())
else nonexhaustivePermutations(length - 1, components)
.flatMap { sub -> components.map { sub + it } }
fun <T> nonexhaustivePermutations(length: Int, components: List<T>): List<List<T>> =
if (components.isEmpty() || length <= 0) listOf(listOf())
else components.map { elm ->
nonexhaustivePermutations(length - 1, components).map { sub -> listOf(elm) + sub }
}.fold(listOf(listOf())) { result, elm -> result + elm }
elm -> nonexhaustivePermutations(length - 1, components)
。在这里,您在每个递归步骤中为每个
nonexhaustivePermutations
调用具有相同参数的
elm
。所以我建议将
components.map
与
nonexhaustivePermutations(length - 1, components).map
交换:
fun <T> nonexhaustivePermutations(length: Int, components: List<T>): List<List<T>> =
if (components.isEmpty() || length <= 0) listOf(listOf())
else nonexhaustivePermutations(length - 1, components).map { sub ->
components.map { elm -> listOf(elm) + sub }
}.fold(listOf(listOf())) { result, elm -> result + elm }
listOf(elm) + sub
替换
sub + elm
来部分修复:
fun <T> nonexhaustivePermutations(length: Int, components: List<T>): List<List<T>> =
if (components.isEmpty() || length <= 0) listOf(listOf())
else nonexhaustivePermutations(length - 1, components).map { sub ->
components.map { elm -> sub + elm }
}.fold(listOf(listOf())) { result, elm -> result + elm }
fold(listOf(listOf()))
替换为
fold(emptyList())
:
fun <T> nonexhaustivePermutations(length: Int, components: List<T>): List<List<T>> =
if (components.isEmpty() || length <= 0) listOf(listOf())
else nonexhaustivePermutations(length - 1, components).map { sub ->
components.map { elm -> sub + elm }
}.fold(emptyList()) { result, elm -> result + elm }
map
替换为
flatMap
,可以将flatting与映射结合起来:
fun <T> nonexhaustivePermutations(length: Int, components: List<T>): List<List<T>> =
if (components.isEmpty() || length <= 0) listOf(listOf())
else nonexhaustivePermutations(length - 1, components).flatMap { sub ->
components.map { elm -> sub + elm }
}
关于kotlin - 如何以一种功能风格生成一定长度的非穷举排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58458981/
我正在尝试开发右边框/Angular 具有特定 Angular (30°) 的表格。我见过一些类似的解决方案,但它们都无法在一定程度上发挥作用。如果我想从 30° 改变到 20°,我不想花太多力气。
我是一名优秀的程序员,十分优秀!