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