1. 程式人生 > >一本通的遞迴練習

一本通的遞迴練習

遞迴練習

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;
}