递归

  • 递归模式:

                     多递归基:为保证有穷性,递归算法都必须设置递归基,且确保总能执行到。为此,针对每一类可能出现的平凡情况,都需设置对应的递归基,故同一算法的递归基可能(显式或隐式的不止一种);

                    例如:数组倒置问题:
 
void reverse (int *,int,int);
void reverse (int * A, int n){
     reverse(A,0,n-1);
}
void reverse (int *  A, int l, int r){
     if  ( l < r ) {//递归基可能是l=r或者l>r
          swap(A[l],A[r]);
          reverse(A, l+1, r-1);
     }
}

                    多向递归:递归调用可能有多种可供选择的分支

                    例如:计算幂函数 。按照线性递归的构思,该函数可重新定义如下:
                                                           

 

                    若从其他角度分析,可给出:
                                                           

 

  
                                                            
                    一般的,若n的二进制展开式为: ,则:
的二进制展开式分别为: ,则有:
                                                                
由此,可归纳得如下递推式:
                                                           
基于这一递归式,有如下多项递归版本:
 
inline __int64 sqr( __int64 a ) {
    return a   *  a ;
}
 
__int64 power2_re ( __int64 n ) {
    if ( n == 0)
    {
        return 1;
    }
    return ( n & 1) ? sqr ( power2_re( n >> 1)) * 2 : sqr ( power2_re( n >> 1));
}

 

上述递归算法的时间复杂度为: ,因为每次递归调用入参均缩小一半

转载于:https://www.cnblogs.com/joh-n-zhang/p/5766755.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值