一本通的遞迴練習
阿新 • • 發佈:2018-12-20
遞迴練習
1199:全排列
給定一個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。 我們假設對於小寫字母有‘a’ <‘b’ < … <‘y’<‘z’,而且給定的字串中的字母已經按照從小到大的順序排列。
char a[10],b[10];//將a字串的各種排列依次放到b字串中 int vis[10],n;//用vis[i]來代表a[i]字母有沒有被訪問過 void dfs(int k){ if(k==n){ cout<<b<<endl; return; } for(int i=0;i<n;i++) if(vis[i]==0){ b[k]=a[i]; //沒有訪問過就放到b陣列中 vis[i]=1; //做上該字母已被訪問的標記 dfs(k+1); //繼續放下一個字母 vis[i]=0; //返回時將字母訪問標誌去掉 } } int main(){ cin>>a; n=strlen(a); dfs(0); return 0; }
1201:菲波那契數列
菲波那契數列是指這樣的數列: 數列的第一個和第二個數都為1,接下來每個數都等於前面2個數之和。 給出一個正整數a,要求菲波那契數列中第a個數是多少。 【輸入】 第1行是測試資料的組數n,後面跟著n行輸入。每組測試資料佔1行,包括一個正整數a(1≤a≤20)。 【輸出】 輸出有n行,每行輸出對應一個輸入。輸出應是一個正整數,為菲波那契數列中第a個數的大小。 【輸入樣例】 4 5 2 19 1 【輸出樣例】 5 1 4181 1
int a[25]; int f(int n){ if(n==1)return a[n]=1; if(n==2)return a[n]=1; return a[n]=f(n-1)+f(n-2); } int main(){ int m=19,n; cin>>n; f(20); //先算出f[1]..f[20]並存儲在a陣列中 for(int i=0;i<n;i++){ cin>>m; cout<<a[m]<<endl; } return 0; }