蓝桥杯老师讲递归
1 //正序打印自然数 0 -9 2 #include <iostream> 3 #include <cstring> 4 using namespace std; 5 6 void fun(int begin,int end) 7 { 8 cout<<begin<<" "; 9 if(begin!=end)//写成begin<end会更好 10 fun(begin+1,end); 11 } 12 int main() 13 { 14 int i,j,k; 15 fun(0,9); 16 cout<<endl; 17 while(1); 18 return 0; 19 } 20 21 22 23 //倒序打印自然数 9-0 24 #include <iostream> 25 #include <cstring> 26 using namespace std; 27 28 void fun(int begin,int end) 29 { 30 31 if(begin!=end)//写成begin<end会更好 32 fun(begin+1,end); 33 cout<<begin<<" "; 34 } 35 int main() 36 { 37 int i,j,k; 38 fun(0,9); 39 cout<<endl; 40 while(1); 41 return 0; 42 } 43 44 45 //倒序打印自然数 0 -9 46 #include <iostream> 47 #include <cstring> 48 using namespace std; 49 50 void fun(int begin,int end) 51 { 52 cout<<begin<<" "; 53 if(begin>=end) //去掉等号是 0-10 54 return ; 55 fun(begin+1,end); 56 } 57 int main() 58 { 59 int i,j,k; 60 fun(0,9); 61 cout<<endl; 62 while(1); 63 return 0; 64 } 65 66 67 68 //无返回值的递归函数求累加和,有返回值时刚开始不会做 69 #include <iostream> 70 #include <cstring> 71 using namespace std; 72 73 int sum = 0; 74 void fun(int begin,int end) 75 { 76 sum += begin; 77 if(begin<end) 78 fun(begin+1,end); 79 } 80 81 int main() 82 { 83 fun(1,100); 84 cout<<sum<<endl; 85 while(1); 86 return 0; 87 } 88 89 //刚开始没想明白怎么递归,盲目的使用全局sum 90 #include <iostream> 91 #include <cstring> 92 using namespace std; 93 94 //系统问我1 - 100和为几?我问另一个人2到100和是几,然后用他的返回值加上 begin,不是1 95 int fun(int begin,int end) 96 { 97 if(begin == end) 98 return begin; 99 return begin += fun(begin+1,end); 100 } 101 102 int main() 103 { 104 int sum = fun(1,100); 105 cout<<sum<<endl; 106 while(1); 107 return 0; 108 } 109 110 111 112 //递归实现串反转 113 #include <iostream> 114 #include <cstring> 115 using namespace std; 116 117 char str[50]; 118 119 void fun(char *p,char *q) 120 { 121 char temp;//若定义成char *temp,发现无法实现反转,想了下或许因为原来p是低地址,交换后p>q,立马推出, 122 //虽然执行了一次 但貌似没一点影响 ,我认为执行n次也没用 ,可以分析下 :第二次递归时又换回来了 123 if(p>=q) 124 return ; 125 temp = *p; 126 *p = *q; 127 *q = temp; 128 fun(p+1,q-1); 129 } 130 131 int main() 132 { 133 int i,j,k; 134 memset(str,0,sizeof(str)); 135 cin>>str; 136 int len = strlen(str); 137 i = 0, j = len-1; 138 fun(str+i,str+j); 139 cout<<str<<endl; 140 while(1); 141 return 0; 142 } 143
1 // next_permutation会自动去重,而那个交换算法打印出来的不是按字典序排列的 2 #include <iostream> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 int main() 8 { 9 int i,j,k; 10 char str[] = {'a','b','b','b'};//只打印四个 11 do 12 { 13 cout<<str<<endl; 14 }while(next_permutation(str,str+4)); 15 while(1); 16 return 0; 17 }
1 //找到相似性,设计出口 ,该算法是蓝桥杯老师讲的,也不是字典序,也不可去重 2 #include <iostream> 3 #include <string> 4 #include <vector> 5 using namespace std; 6 7 vector <string > fun(string str) 8 { 9 int i,j,k; 10 char ch = str[0]; 11 vector <string > r; 12 if(str.length()==1) 13 { 14 r.push_back(str); 15 return r; 16 } 17 string str1 = str.substr(1); 18 vector <string > x = fun(str1); 19 for(i=0; i<x.size(); i++) 20 { 21 for(j=0; j<x[i].length()+1; j++)//条件是长度加一 22 { 23 string s = x[i].substr(0,j) +ch + x[i].substr(j);//顺序不可反, 24 r.push_back(s); 25 } 26 } 27 return r; 28 } 29 30 int main() 31 { 32 int i,j,k; 33 string str = ""; 34 while(cin>>str) 35 { 36 cout<<"-------------"<<endl; 37 vector <string > v = fun(str); 38 for(i=0; i<v.size(); i++) 39 { 40 cout<<v[i].c_str()<<endl; 41 } 42 str.clear(); 43 cout<<"--------------"<<endl; 44 } 45 return 0; 46 }
小任务和大任务有相似性并且可以解决 ,这是最重要的,第二就是设计出口。也就是先写递归主体再设计出口。
递归就是调用和自己同名的函数,可以任何时候都调用递归并且在进入递归的时候检查是否继续递归;或者满足条件的话才进行递归
递归一定要有参数,否则就无法划分子问题了
相似任务,简单任务,出口。
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.