使用遞迴函式,輸出n個元素的所有子集
題目描述:
請編寫一個遞迴函式,用來輸出n個元素的所有子集。例如,三個元素{a,b,c}的所有子集是:{},{a},{b},{c},{a,c},{ac},{b,c},{a,b,c}.
解題思路:
根據子集的定義,集合中的每一個元素在子集中都有兩種狀態:‘1’表示出現,'0'表示不出現;如果所有的元素都不出現,則該子集是空集,如果所有的元素都出現,則該子集是全集。
我們定義一個標記陣列tag,用於記錄集合中對應的元素是否出現,每層遍歷對應集合中的每個元素,都有出現(為‘1’)和不出現(為‘0’)兩種可能,一直遍歷到所有的元素的可能都標記完,然後根據陣列函式輸出結果。
程式程式碼:
#include <iostream> using namespace std; void build(char *str,int *tag,int n) { if(n==5) { cout<<"{"; for(int i=0;i<5;i++) if(tag[i]==1) cout<<str[i]; cout<<"}"<<endl; return; } tag[n] = 0; build(str,tag,n+1); tag[n] = 1; build(str,tag,n+1); } int main() { char a[5]={'a','b','c','d','e'}; int tag[5]; build(a,tag,0); return 0; }
輸出結果:
{}
{e}
{d}
{de}
{c}
{ce}
{cd}
{cde}
{b}
{be}
{bd}
{bde}
{bc}
{bce}
{bcd}
{bcde}
{a}
{ae}
{ad}
{ade}
{ac}
{ace}
{acd}
{acde}
{ab}
{abe}
{abd}
{abde}
{abc}
{abce}
{abcd}
{abcde}
一共有2^5 = 32個子集。
這是《資料結構與演算法應用》中的一道課後題,看了作者的標準答案:http://www.mhhe.com/engcs/compsci/sahni/c1/E5.HTM
發現和我的思路是一樣的,哈哈,英雄所見略同~