Programming 板


LINE

※ 引述《billy20510 ( *~鴨子~*)》之銘言: : char buf[3]={'a','b','c'}, ans[4]; : int total_len=3; : void Powerset(int i, int j) : { : if (j==total_len) { : ans[i]=0; : cout<<'{'<<ans<<'}'<<endl; : } : else { : Powerset(i,j+1); : ans[i]=buf[j]; : Powerset(i+1,j+1); : } : } 我想要這樣解釋。一個規劃得很好的遞迴,可分為 basic case 和 recursive case 。 在 base case 中,程式經過 recursive case 之後,最後累積一些東西,可以印出。 所以想想以下這個,寫了一半的 Powerset : void Powerset(int i, int j) { if (j == total_len) { ans[i] = 0; cout << '{' << ans << '}' << endl; } else { ans[i] = buf[j]; Powerset(i+1, j+1); } } 丟一個 Powerset(0, 0) 下去,會印出 abc\0 。 同理,丟一個 Powerset(1, 1) 下去,會印出 bc\0 。 丟一個 Powerset(2, 2) 下去,會印出 c\0 。 接著再想想下面這個寫了另一半的 Powerset : void Powerset(int i, int j) { if (j == total_len) { ans[i] = 0; count << '{' << ans << '}' << endl; } else { Powerset(i, j+1); ans[i] = buf[j]; } } 丟個 Powerset(0, 0) 會一路拉到 Powerset(0, 3) ,結果印出 \0 , empty set 。 丟個 Powerset(1, 1) 會一路拉到 Powerset(1, 3) ,結果印出 ans[0]\0 , 看之前 ans[0] 放了什麼。 丟個 Powerset(2, 2) 會拉到 Powerset(2, 3) ,結果印出 ans[0] ans[1]\0 , 看之前 ans[0] 和 ans[1] 遺留了什麼。 ---- 比較囉唆的實例解釋: 前後兩半 Powerset 合在一起,效果是,當 Powerset(0, 0) 在走向 Powerset(3,3) 時,會帶出 Powerset(0, 1) ,而 Powerset(0, 1) 中間會有 ans[0] = buf[1] , 得到 b 開頭的狀態,之後又產生 Powerset(1, 2) 。 所以看起來, Powerset(m, n) 是什麼東西呢?我覺得,可以說是 m 是空間索引, n 是字集索引,而 Powerset(m, n) 則稱為「把第 n 個字複製到 第 m 個位置上做為開頭的 power set 」,這樣,把 Powerset(m, n) 當作是醒目 的物件,來閱讀原程式,可能會比較讀得懂意思。 把 Powerset(0,0) 的生成層次寫出來,就很清楚,而且前面所講的兩半合在一起 的時候,有點像「乘法」的效果。 [ ] Powerset(0, 0) Powerset(0, 1) Powerset(0, 2) Powerset(0, 3) => \0 [c ] Powerset(1, 3) => c\0 [b ] Powerset(1, 2) Powerset(1, 3) => b\0 [bc ] Powerset(2, 3) => bc\0 [a ] Powerset(1, 1) Powerset(1, 2) Powerset(1, 3) => a\0 [ac ] Powerset(2, 3) => ac\0 [ab ] Powerset(2, 2) Powerset(2, 3) => ab\0 [abc ] Powerset(3, 3) => abc\0 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.69.214
※ 文章網址: http://webptt.com/m.aspx?n=bbs/Programming/M.1413392877.A.345.html ※ 編輯: yauhh (114.42.69.214), 10/16/2014 01:09:50
1F:推 billy20510: 好清楚的解釋~ 36.233.78.242 10/16 16:17







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP