首页 > 代码库 > 经典递归问题

经典递归问题

运用递归解决问题的要点:

(1)缩小问题规模(将问题分为若干步,注意构造问题间的相似性)

(2)分析递归出口

下面从一些经典的实例来分析递归问题的特征

 

1.从n个小球中取m个,问有多少种取法?

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int f(int n,int m){
 5     if(n<m) return 0;
 6     if(m==0) return 1;
 7     return f(n-1,m)+f(n-1,m-1);
 8 }
 9 int main(){
10     int n,m;
11     cin>>n>>m;
12     cout<<f(n,m);
13 }

 

2.打印字符串的全排列

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 void f(string str,int k)
 7 {
 8     if(str.length()-1==k){
 9         cout<<str<<endl;
10         return;
11     }
12     for(int i=k;i<str.length();i++){
13         swap(str[k],str[i]);
14         f(str,k+1);
15         swap(str[k],str[i]);
16     }
17 }
18 int main()
19 {
20     string str="abc";
21     f(str,0);
22     return 0;
23 }

 

经典递归问题