如何写出递归逻辑

前言

一次交流中被问到如何实现一组数字的全排列,比如【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) {
    val temp = c[a]
    c[a] = c[b]
    c[b] = temp
}

fun printlnList(c: ArrayList) {
    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) {
    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循环解决问题。理解转换后的递归麻烦且只强行记忆。

你可能感兴趣的:(如何写出递归逻辑)