五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

輸出1-n的全排列(按字典序)

2022-10-19 13:43 作者:-王-小-明-  | 我要投稿

先上題

一道題

再上代碼

這個(gè)問題的棘手之處就在于n是不確定的。

如果n確定,為了按照字典序輸出,我們可以通過循環(huán)的嵌套以及幾個(gè)條件判斷直接輸出,比如這樣:

但n是不確定的,我們并不知道要套幾層循環(huán),這就需要遞歸的使用。

遞歸的核心有三點(diǎn):起始點(diǎn)、遞推關(guān)系和邊界條件。

在這個(gè)問題里,起始點(diǎn)可以從第一位開始。

而遞推關(guān)系體現(xiàn)為:我們?nèi)绻辛诉@n個(gè)數(shù)選取x個(gè)數(shù)后在前x位上所有的排列,我們可以在它的基礎(chǔ)上給出這n個(gè)數(shù)在前x%2B1位上所有選取后的排列。

對(duì)于每一種已知的排列,我們只需要從1n遍歷一遍,分別找到所有在這一個(gè)排列中沒有出現(xiàn)過的數(shù)字,放在第x%2B1位上,便可以得到需要的結(jié)果。

而邊界條件就是x%3En,也即當(dāng)我們把前n位都填充完之后,我們已經(jīng)得到了一種排列,只需要輸出即可。

到這里這個(gè)遞歸的思路已經(jīng)了然了,剩下的是一個(gè)小的優(yōu)化,也就是sgn數(shù)組的加入。

在我們從1n遍歷的時(shí)候,需要與前面的數(shù)比對(duì)以確定是否重復(fù),這是一筆不小的開銷。為了減少這個(gè)開銷,我們選擇開一個(gè)sgn數(shù)組,用于標(biāo)志該數(shù)是否已在前x位中被選取。

當(dāng)我們?cè)诘?img type="latex" class="latex" src="https://api.bilibili.com/x/web-frontend/mathjax/tex?formula=x" alt="x">位上放置一個(gè)數(shù)i時(shí),我們將sgn%5Bi%5D置為1,表示該數(shù)已被選取,而當(dāng)后面的函數(shù),即arrange(x%2B1)調(diào)用結(jié)束時(shí),我們將sgn%5Bi%5D置為0,因?yàn)闊o論之后是還在該層繼續(xù)循環(huán),還是跳出循環(huán),該位都不再選取i。

把兩個(gè)代碼作比較可能會(huì)好理解一些:

code2中的for循環(huán)就對(duì)應(yīng)code1中的for循環(huán),只不過code2中循環(huán)的嵌套是直接寫出來的,code1中的循環(huán)嵌套則通過遞歸實(shí)現(xiàn)。code2中取不同變量名是為了區(qū)分,而code1中不同層的循環(huán)在不同的函數(shù)中,不需要在名字上做區(qū)分。

code2中的條件判斷就對(duì)應(yīng)code1中對(duì)sgn%5Bi%5D的判斷以及反復(fù)的置01。

code2中最后一次循環(huán)正常結(jié)束便可輸出一個(gè)結(jié)果,而code1中則是到第x%3Dn%2B1時(shí),遞歸到最底層,輸出結(jié)果。不同點(diǎn)則在于code2的循環(huán)中完整保留了各位的信息,而code1需要一個(gè)數(shù)組來存放這些信息。


以上。

遞歸還是要多寫,剛接觸的時(shí)候確實(shí)會(huì)比較懵,但把三個(gè)核心點(diǎn)寫好,遞歸還是可以以簡(jiǎn)單的思路實(shí)現(xiàn)的。

輸出1-n的全排列(按字典序)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
治县。| 新营市| 天镇县| 新邵县| 玉林市| 衡阳县| 伊川县| 永修县| 莱阳市| 百色市| 沂源县| 嘉禾县| 分宜县| 长顺县| 茌平县| 扎鲁特旗| 北票市| 凤山市| 商河县| 商城县| 虹口区| 新巴尔虎右旗| 白银市| 商城县| 江口县| 涟水县| 文水县| 普格县| 拉萨市| 辽宁省| 饶平县| 佛学| 即墨市| 乳山市| 玛多县| 公主岭市| 怀安县| 河源市| 天峻县| 易门县| 河津市|