zoukankan      html  css  js  c++  java
  • 蓝桥杯老师讲递归

      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 } 

     小任务和大任务有相似性并且可以解决 ,这是最重要的,第二就是设计出口。也就是先写递归主体再设计出口。

    递归就是调用和自己同名的函数,可以任何时候都调用递归并且在进入递归的时候检查是否继续递归;或者满足条件的话才进行递归

    递归一定要有参数,否则就无法划分子问题了

    相似任务,简单任务,出口。

  • 相关阅读:
    Problem F
    Problem L
    Problem L
    Problem B
    Problem B
    读书笔记-Java设计模式
    读书笔记-内存初始化和清理
    读书笔记- 一切都是对象
    Android多点触控技术实战,自由地对图片进行缩放和移动
    Native开发与JNI机制详解
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2821735.html
Copyright © 2011-2022 走看看