zoukankan      html  css  js  c++  java
  • 和菜鸟一起学算法之递归和分治简单实例

                  说来也够惭愧,学了C语言这么久,AC了那么多的题,现在连递归和分治都不是很会用。还是得好好总结下啊,要不然都荒废了。发现学习真的是递进的,以前学的,不是很懂的东西,现在看来都觉得很简单了,不是那么难以理解。也许真的进步了,也许是以前不够努力吧。不管怎样,学到了就是自己的。

                  对于,递归,一般大家都知道的就是那个求阶乘了。1*2*3*……*n。可以递归调用自己来求解。返回的return值不断减少,知道为1。这个一般都很好理解,问题是遇到了其他的问题,可不是这么简单的了。

                  对于,分治,分而治之,大问题分为小问题,然后再把小问题不断分为更小的问题,最后解决掉后,合并为原问题的解。其实分治就是运用了递归的,或者直接用递推来做。如果看来,要学好算法,递归多么重要啊。而学会递归,主要还是要学会其递归算法的实现,代码其实并不多,有了思路,就会很快解决的。

                  求最大值和最小值,相信再简单不过了,只要一个循环遍历,然后每次比较最大的和最小的值,然后遍历完后就得到了最大值和最小值了。

                  还有就是先排序,然后最大值和最小值就是头尾了。

                  这里既然说到了分治和递归,那么就要用分治法来求最大值和最小值了。多的不说,先上代码了。

    #include <stdio.h>
     
    int aa[] = {1, 5, 0, -8, 4, 2};
     
    void get_max_min(int *s, int *nmax, int * nmin, int left, int right)
    {
                  int max1, max2;
                  int min1, min2;
                  int mid;
                  
                  if(left == right)      //最小的子问题就一个数,那么最大值和最小值都是其本身
                  {
                                 *nmax = *nmin = s[left];       
                                 return ;                  
                  }
                  else if(left == (right - 1)) //最小的子问题是两个数,那么比较得出其最大最小值。
                  {
                                 max1 = s[left];
                                 max2 = s[right];
                                 *nmax = max1 > max2 ? max1 : max2;
                                 *nmin = max1 < max2 ? max1 : max2;
                                 return ;
                  }
                  else   //否则,子问题还不够小,那么继续分治
                  {
                                 mid = (left + right) / 2;
                                 get_max_min(s, &max1, &min1, left, mid);
                                 get_max_min(s, &max2, &min2, mid+1, right);
                                *nmax = max1 > max2 ? max1 : max2;               //子问题的解合并求最大值和最小值
                                 *nmin = min1 < min2 ? min1 : min2;                  
                                 return ;
                  }
    }
     
    int main()
    {
                  int max, min;
                 
                  get_max_min(aa, &max, &min, 0, 5);   
                  
                  printf("max: %d\n", max);     
                  printf("min: %d\n", min);
                  
                  return 0;
    }
    
     
    
    


    看了代码+注释了,相信一般还是可以理解了吧?如果还不是很理解,没事,我们继续慢慢分析,一步一步分析吧。

     

     

     

     

    由上面的图,可以看出,数据的流程。函数的调用和递归。这个是最简单的分治和递归了。

  • 相关阅读:
    社交需求和社交产品的更替
    腾讯产培生面经
    【C++基础】类class
    【C++基础】结构struct
    【C++基础】C-串知识整理
    GeoServer war包在tomcat7中配置遇到的一个问题
    pgrouting 2.0 的环境配置
    阿里2014年9月笔试中的一个算法设计题--擦黑板剩余数字
    VisualSVN Server的启动关闭脚本
    二叉树遍历(前序、中序、后序)的递归及非递归实现(小结)
  • 原文地址:https://www.cnblogs.com/wuyida/p/6300046.html
Copyright © 2011-2022 走看看