前言
一次交流中被问到如何实现一组数字的全排列,比如【1,2,3】有多少种排列组合方式,如果拓展到【1,2,3,4,5】呢?
回顾
1.由于【1,2,3】有6种排列组合方式 1 * 2 * 3 = 6
2.得到【1,2,3,4,5】有 1 * 2 * 3 * 4 * 5 = 120 种组合方式
3.想到曾经在学习时总是接触到排列,想到用代码去实现,于是很感兴趣,对此问题感觉与其他问题不同,
4.直觉确定需要写成递归逻辑,但是如何直接写入一个递归函数???
5.想到过去总是写树的遍历,实时上这种代码都是背下来的,如何写入一个递归函数。
for
import kotlin.collections.ArrayList
fun main() {
val list = arrayListOf(1, 2, 3, 4)
for (i in 0..3) {
swap(0, i, list)
for (j in 1..3) {
swap(1, j, list)
for (k in 2..3) {
swap(2, k, list)
printlnList(list)
swap(k, 2, list)
}
swap(j, 1, list)
}
swap(i, 0, list)
}
}
fun swap(a: Int, b: Int, c: ArrayList<Int>) {
val temp = c[a]
c[a] = c[b]
c[b] = temp
}
fun printlnList(c: ArrayList<Int>) {
for (a in c) {
print("$a ")
}
print("\n")
}
递归
import kotlin.collections.ArrayList
fun main() {
val list = arrayListOf(1, 2, 3, 4)
test1(0, 3, list)
}
fun test1(start: Int, end: Int, list: ArrayList<Int>) {
if (start + 1 == end) {
for (i in start..end) {
swap(start, i, list)
printlnList(list)
swap(i, start, list)
}
return
}
for (i in start..end) {
swap(start, i, list)
test1(start + 1, end, list)
swap(i, start, list)
}
}
回顾
此时有些想起动态规划,曾经一直觉得递归函数很难实现,很多复杂递归函数也看不懂。我的理解,递归函数本就是计算机语言,更适合计算机去理解,而我们需要做的就是写出for循环的demo,转换它为递归,至于理解递归,需要做的只是有能力写出对的for循环解决问题。理解转换后的递归麻烦且只强行记忆。