递归算法与分治策略

关于递归的学习

一、

    1、递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的的问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。

 递归是一种直接或间接调用自身的函数的一种算法,很常用,一般用于解决三类问题:

  1. 数据的定义按递归定义的。(FIbonacci函数)
  2. 数据的结构形式是按递归定义的。(图,树等)
  3. 问题解法用递归算法实现。(回溯算法)//

  2、使用递归的几个条件

  1. 这个问题是可以分解的,分解出来的问题的解法与之前的大问题的解法相同。
  2. 是一个可以分解到最后可以解决的问题,也就是有结束的条件,边界条件。

 3、递归与循环算法的比较

      一般情况下一个问题可以用循环来解决就可以用递归来解决。很相似,但是是两种不同的思路。

递归的优点在于代码简洁,一眼看过去就明白个大概,但是假如调用的层数太多,就会导致内存方面的问题,会占用过多的内存空间。而循环呢,结构简单,道理也简单。对于一些简单的问题,个人感觉循环就完事了。

递归的缺点在于运行的效率低,通常会把递归算法转换为 递推 或者非递归的算法

 

二、

经典的算法以及一些常用的操作(地方)

 1、Fibonacci函数———每一项都是前两项的和

      (1)递归实现:递归调用次数太多

int A(int  n )//第n项的值
{
    if(n<=1) return 1;
    return A(n-1)+A(n-2);
}

       (2)递推:

int A(int n)
{
    int a=1,b=1,c=0;
    for(int i=0;i<n;i++)
    {
        c=a+b;
        a=b;
        b=c;
    }
    reurn c;
}

 

2、整数划分问题———把一个整数n

int A(int n,int max)//n是要拆分的树,max是一个划分                     
{
   if(n<1)return 0;
   else if(n==1||m==1) return 1;
   else if(n<max) return A(n,n);
   else if(n==max) return A(n,m-1)+1;
   return A(n,max-1)+A(n-max,max);
}

 

分治策略

     求解一个复杂问题可以将其分解成若干子问题,子问题在分解成更小的问题,直到可以直接求解为止。

 

条件:

  1. 问题能够按照某种方法分解为若干个规模较小相互独立与原问题类型相同的问题;
  2. 子问题足够小时可以直接求解;
  3. 能够将子问题的解组合成原问题的解。

 

相关的算法:快速排序 ,二分查找等等

 

经典例题:二分查找

二分查找需要一个默认的前提,那就是查找的数列是有序的。 二分查找的思路比较简单:

1) 选择一个标志i将集合分为二个子集合

2) 判断标志L(i)是否能与要查找的值des相等,相等则直接返回

3) 基于判断的结果决定下步是向左查找还是向右查找然后递归
 

int binarySearch(int array[], int low, int high, int target) 
{
    int middle = (low + high)/2;
    if(low > high)
    {
        return -1;
    }
    if(target == array[middle]) 
    {
        return middle;
    }
    if(target < array[middle]) 
    {
        return binarySearch(array, low, middle-1, target);
    }
    if(target > array[middle]) 
    {
        return binarySearch(array, middle+1, high, target);
    } 
}

 

   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值