Re: [問題]用遞迴寫一個PowerSet,求解釋

作者: yauhh (小y寶貝)   2014-10-16 01:07:54
※ 引述《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] 遺留了什麼。

Links booklink

Contact Us: admin [ a t ] ucptt.com