C++遞歸求解N個元素的所有子集
引言:
我在復習C++遇到了設計遞歸函數的問題。這個例子,很好的顯示了設計遞歸的方式,思想。
這與斐波那數列不同,這個例子更有應用意義。
問題:
試編寫一個遞歸函數,用來輸入n個元素的所有子集。
例如:三個元素{a,b,c}
輸出:
{a,b,c}
{ab}
{ac}
{bc}
{a}
{b}
{c}
{}
設計思路:
首先,遞歸是使用的if else結構。
然后,就是if中填條件,再在else寫調用自身的函數。
詳細思路,請看代碼。
代碼:
#include <string.h> #include <iostream> using namespace std; void build(char str[],int n) { if(n==0)//控制輸出 { cout<<"{"; for(int i=0;i<strlen(str);++i) if(str[i]!=' ') { cout<<str[i]; } cout<<"}"<<endl; } else { /*** 先遞歸 ***/ build(str,n-1); char newstr[5] = {' '};//去掉就把該位置的元素置成空 /*** 還原之前的狀態 ***/ strcpy(newstr,str); /*** 越來越少的元素 ***/ newstr[n-1]= ' '; /*** 再次遞歸 ***/ build(newstr,n-1); } }
作者感言:
其實,設計遞歸的關鍵是如何設計。想不到,就百度。看代碼也是個快樂的過程,關鍵是仔細思考。
囫圇吞棗,對於程序員是要不得了。如果你無法做到,用手到后拈來。那么,你學習這個東西是失敗的!