前言
一次交流中被問到如何實現(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)在學習時總是接觸到排列,想到用代碼去實現(xiàn),于是很感興趣,對此問題感覺與其他問題不同,
4.直覺確定需要寫成遞歸邏輯,但是如何直接寫入一個遞歸函數(shù)???
5.想到過去總是寫樹的遍歷,實時上這種代碼都是背下來的,如何寫入一個遞歸函數(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)
}
}
回顧
此時有些想起動態(tài)規(guī)劃,曾經(jīng)一直覺得遞歸函數(shù)很難實現(xiàn),很多復雜遞歸函數(shù)也看不懂。我的理解,遞歸函數(shù)本就是計算機語言,更適合計算機去理解,而我們需要做的就是寫出for循環(huán)的demo,轉(zhuǎn)換它為遞歸,至于理解遞歸,需要做的只是有能力寫出對的for循環(huán)解決問題。理解轉(zhuǎn)換后的遞歸麻煩且只強行記憶。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。