如何寫出遞歸邏輯

前言

一次交流中被問到如何實(shí)現(xiàn)一組數(shù)字的全排列,比如【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.想到曾經(jīng)在學(xué)習(xí)時(shí)總是接觸到排列,想到用代碼去實(shí)現(xiàn),于是很感興趣,對(duì)此問題感覺與其他問題不同,
4.直覺確定需要寫成遞歸邏輯,但是如何直接寫入一個(gè)遞歸函數(shù)???
5.想到過去總是寫樹的遍歷,實(shí)時(shí)上這種代碼都是背下來的,如何寫入一個(gè)遞歸函數(shù)。

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)
    }
}

回顧

此時(shí)有些想起動(dòng)態(tài)規(guī)劃,曾經(jīng)一直覺得遞歸函數(shù)很難實(shí)現(xiàn),很多復(fù)雜遞歸函數(shù)也看不懂。我的理解,遞歸函數(shù)本就是計(jì)算機(jī)語言,更適合計(jì)算機(jī)去理解,而我們需要做的就是寫出for循環(huán)的demo,轉(zhuǎn)換它為遞歸,至于理解遞歸,需要做的只是有能力寫出對(duì)的for循環(huán)解決問題。理解轉(zhuǎn)換后的遞歸麻煩且只強(qiáng)行記憶。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容