暴力遞歸

暴力遞歸就是嘗試

  1. 把問題轉(zhuǎn)化為規(guī)谋⒅簦縮小了的同類問題的子問題
  2. 有明確的不需要繼續(xù)進行遞歸的條件(base case)
  3. 有當(dāng)?shù)玫搅俗訂栴}的結(jié)果之后的決策過程
  4. 不記錄每一個子問題的解

漢諾塔問題

有三個可以使用的桿,將從大到小擺放的圓盤移到另一個桿子上给僵。圓盤在的桿子為from,圓盤要去的桿子為to详拙,剩下的桿子叫other

  • 把i-1從from移到other
  • 把i從from移到end
  • 把i-1從other移到end

打印一個字符串的全部子序列(子集)帝际,包括空字符串

解決方法:

  • 遍歷所有的字符,每個字符都有兩種處理方式饶辙,要或者不要
  • 處理要和不要兩種狀態(tài)蹲诀,如果要,將字符加到要輸出的list中弃揽,如果不要脯爪,就不加字符
  • 遍歷到最后一個字符则北,將其輸出

打印一個字符串的全部排列,要求不要出現(xiàn)重復(fù)的排列.

  • 全排列是指痕慢,相同的字符尚揣,將字符放在不同順序的排列。
  • 每個位置嘗試放字符串里的所有字符守屉。

給定一個整型數(shù)組arr惑艇,代表數(shù)值不同的紙牌排成一條線。

玩家A和玩家B依次拿走每張紙牌滨巴,規(guī)定玩家A先拿,玩家B后拿俺叭,但是每個玩家每次只能拿走最左或最右的紙牌,玩家A和玩家B都絕頂聰明熄守。請返回最后獲勝者的分?jǐn)?shù)。
【舉例】
arr=[1,2,100,4]裕照。
開始時攒发,玩家A只能拿走1或4晋南。如果開始時玩家A拿走1,則排列變?yōu)閇2,100,4]负间,接下來玩家 B可以拿走2或4,然后繼續(xù)輪到玩家A...
如果開始時玩家A拿走4政溃,則排列變?yōu)閇1,2,100]趾访,接下來玩家B可以拿走1或100董虱,然后繼
續(xù)輪到玩家A...
玩家A作為絕頂聰明的人不會先拿4,因為拿4之后愤诱,玩家B將拿走100。所以玩家A會先拿1转锈,
讓排列變?yōu)閇2,100,4],接下來玩家B不管怎么選楚殿,100都會被玩家 A拿走撮慨。玩家A會獲勝竿痰,
分?jǐn)?shù)為101。所以返回101砌溺。
arr=[1,100,2]影涉。
開始時,玩家A不管拿1還是2规伐,玩家B作為絕頂聰明的人蟹倾,都會把100拿走。玩家B會獲勝猖闪,
分?jǐn)?shù)為100鲜棠。所以返回100。

  • 模擬天才腦子里的計算思路培慌,用笨方法去試
  • 對于同一個整型數(shù)組豁陆,
  • 先手函數(shù),計算拿走左邊紙牌加后手剩下紙牌得到的分?jǐn)?shù)與拿走右邊紙牌加后手剩下紙牌得到的分?jǐn)?shù)吵护,選擇分?jǐn)?shù)較高的一邊
  • 后手函數(shù)盒音,去掉左邊紙牌后先手剩下的紙牌得到的分?jǐn)?shù)與去掉右邊紙牌后先手剩下的紙牌得到的分?jǐn)?shù),選擇較低分?jǐn)?shù)的方案馅而。因為對方會選擇對我最不利的方法祥诽。
  • 先手和后手函數(shù)的區(qū)別,如果整型數(shù)組里只有一個數(shù)瓮恭,先手可以得到它雄坪,后手不能得到它

給你一個棧,逆序這個棧偎血,不能申請額外的數(shù)據(jù)結(jié)構(gòu)诸衔,只能使用遞歸函數(shù),如何實現(xiàn)颇玷?

  • 遞歸1,每次遞歸存棧底的值笨农,棧pop到空后,依次返回帖渠,并將值push
  • 遞歸2,目的是取到棧底的值谒亦,每次取出棧頂?shù)闹担绻麠榭湛战迹祷胤菡校绻麠2粸榭眨阎抵匦聀ush入棧

規(guī)定1和A對應(yīng)狞甚、2和B對應(yīng)锁摔、3和C對應(yīng)

那么一個數(shù)字字符串{”111“)可以轉(zhuǎn)化為字符字符串(”AAA“)、”KA“哼审、”AK“谐腰,
給定一個只有數(shù)字字符串組成的字符串str孕豹,返回有多少種轉(zhuǎn)化結(jié)果。

  • 假設(shè)0 - i - 1 位置的轉(zhuǎn)化已經(jīng)決定好了十气,只考慮i之后的轉(zhuǎn)化
  • 如果i位置為0,則無法轉(zhuǎn)換
  • 如果i位置非0, 情況一励背,i位置轉(zhuǎn)化為對應(yīng)字符,或者i位置和i+1位置不能組成字符砸西,繼續(xù)遞歸處理i+1位置叶眉;情況二衅疙,i位置和i+1位置可以組成字符杖狼,將其轉(zhuǎn)換為字符,繼續(xù)遞歸處理i+2位置

給定兩個長度都為N的數(shù)組weights和values蝶涩,weights[i]和values[i]分別代表i號物品的重量和價值。給定一個正數(shù)bag嗽上,表示一個載重bag的袋子熄攘,你裝的物品不能超過這個重量。返回你能裝下最多的價值是多少浅萧?

思路:

  • 每個位置要或者不要哲思,找出符合條件(重量不能超過袋子)的最多的價值
  • 每次遞歸處理i位置的值,每次遞歸有兩種選擇棚赔,要i位置或者不要i位置,選擇能獲得最大價值的選擇丧肴。
  • basecase, 當(dāng)現(xiàn)有重量超過袋子的重量胧后,該選擇不能要,返回0,當(dāng)現(xiàn)在的位置超過了N壳快,返回現(xiàn)有重量江醇。

N皇后問題

是指在N*N的棋盤上要擺N個皇后,要求任何兩個皇后不同行凛驮、不同列, 也不在同一條斜線上宏胯。 給定一個整數(shù)n,返回n皇后的擺法有多少種肩袍。 n=1婚惫,返回1。 n=2或3艰管,2皇后和3皇后問題無論怎么擺都不行蒋川,返回0。 n=8捺球,返回92。

  • 復(fù)雜度較高o(nn
public class NQueens {
    public static int num1(int n){
        if(n < 1){
            return 0;
        }
        int[] record = new int[n];//表示index行裂逐,int[index]列放了皇后
        return process(0, record, n);
    }
    //record[0..i-1]的皇后一定不共行胆剧,不共列,不共斜線
    //目前來到了第i行
    //record[0..i-1]表示之前的行篙悯,放了皇后位置
    //n表示整體一共有多少行
    //返回值是铃绒,擺完所有的皇后,合法的擺法有多少種
    public static int process(int i, int[] record, int n){
        if( i == n){ // 終止行
            return 1;
        }
        int res = 0;
        for(int j = 0; j < n; j++){
            if(isValid(record, i, j)){
                record[i] = j;
                res += process(i + 1, record, n);
            }
        }
        return res;
    }
    public static boolean isValid(int[] record, int i, int j){
        for(int k = 0; k < i; k++){
            if(j == record[k] || Math.abs(record[k] - j) == Math.abs(i - k)){
                return false;
            }
            
        }
        return true;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矮燎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子澜沟,更是在濱河造成了極大的恐慌,老刑警劉巖茫虽,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件濒析,死亡現(xiàn)場離奇詭異,居然都是意外死亡号杏,警方通過查閱死者的電腦和手機斯棒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門名船,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渠驼,你說我怎么就攤上這事“俳遥” “怎么了蜓席?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祈秕。 經(jīng)常有香客問我雏胃,道長,這世上最難降的妖魔是什么瞭亮? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮仙蚜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呜师。我一直安慰自己贾节,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霎匈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铛嘱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天球匕,我揣著相機與錄音帖烘,去河邊找鬼。 笑死照卦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的役耕。 我是一名探鬼主播聪廉,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼框全!你這毒婦竟也來了邻邮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤丹泉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后摹恨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡睁宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年柒傻,在試婚紗的時候發(fā)現(xiàn)自己被綠了较木。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡预侯,死狀恐怖峰锁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情虹蒋,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布耍目,位于F島的核電站,受9級特大地震影響邪驮,放射性物質(zhì)發(fā)生泄漏傲茄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一喻粹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧守呜,春花似錦、人聲如沸查乒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蓖议。三九已至,卻和暖如春勒虾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背修然。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工低零, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拯杠,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓雄妥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親老厌。 傳聞我的和親對象是個殘疾皇子黎炉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容