打印出一个元素不重复的数组的所有子集

文章目录

  • 1.打印出一个元素不重复的数组的所有子集
    • 1.1 代码
    • 1.2 思路
    • 1.3 总结

1.打印出一个元素不重复的数组的所有子集

1.1 代码

  • 递归打印子集:
fun printSubset(aimedArray: IntArray, index: Int = 0, subset: MutableList<Int> = mutableListOf<Int>()) {
    // 打印子集
    println(subset.toString())
    // 循环未放入子集的元素,依次取出一个放入子集中作为新的子集
    for (i in index until aimedArray.size) {
        val newSubset = mutableListOf<Int>().apply {
            add(aimedArray[i])
            addAll(subset)
        }
        printSubset(aimedArray, i + 1, newSubset)
    }
}
  • 测试代码:
fun main() {
    val aimedArray = intArrayOf(1, 2, 3)
    printSubset(aimedArray)
}

1.2 思路

  • step1:
  • 初始时,传入原数组,和一个空的子集。

打印出一个元素不重复的数组的所有子集_第1张图片

  • step2:
  • 分别取出下标为index的元素到数组截止的元素,加到当前子集中,作为下次递归打印的子集。一共会产生3个递归。
  • 注意:当index大于范围将不再产生递归,所以递归是有限的不是无限循环的。第3个递归的index大于目标数组范围,在打印完子集后,将不再产生新的递归。

PrintSubset2

  • step3:
  • 针对step2的第一个继续分析:
  • 继续对其执行执行step2,会产生2个递归。其中第2个递归的index大于目标数组范围,在打印完子集后,将不再产生新的递归。

打印出一个元素不重复的数组的所有子集_第2张图片

  • step4:
  • 针对step3的第一个继续分析:
  • 继续对其执行执行step2,会产生1个递归。且该递归的index大于目标数组范围,在打印完子集后,将不再产生新的递归。

打印出一个元素不重复的数组的所有子集_第3张图片

  • step5:
  • 将上述中所有递归执行完毕,即打印完了所有子集。

1.3 总结

  • 算法的实现就是每次循序都是将目标数组index开始数组截止的元素,依次取出,与现有子集组成新的子集然后递归

你可能感兴趣的:(算法)