C语言进阶-6讲: 递归法问题求解

知识点总结:


        递归(两个特点)
               1)递归就是在过程或函数里面调用自身;
               2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口。

        递归分为两个阶段:
               1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
               2)回归(返回值):当获得最简单的情况后,逐步返回,依次得到复杂的解.


         直接/间接递推
               直接递归调用就是在函数a(或过程)中直接引用(调用)函数a本身
               间接递归调用就是在函数a(或过程)中调用另外一个函数b,而该函数b又引用(调用)了函数a

        
         递归法问题求解一般思路:
               列出递归方程/思路
               写出递归函数
               调用递归函数

              

          递归和迭代的区别:

          1)迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高。
                递归过程中, 自己调用自己,问题的规模在缩小,这样最终得到问题的解。
                遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。

          2)递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换。
                能用迭代的不用递归,递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出。

//二分查找迭代版  
int binary_search(int *p,int n,int k){  
    int i=-1;                   //i为所查数的序号  
    int low=0,high=n-1,middle;  
    while(low<=high){  
        middle=(low+high)/2;  
        if(*(p+middle)==k){  
            i=middle;  
            break;              //找到即跳出循环  
        }  
        else if(*(p+middle)>k)  //k在序号low和middle之间  
            high=middle-1;  
        else                    //k在序号middle和high之间  
            low=middle+1;  
    }  
    return i;                   //若k存在则i等于middle,否则为-1  
}  
//二分查找递归版
int r_search(int arr[], int low, int high, int k)  
{  
    int i,mid;  
    if (low>high) i=-1;  
    else  
    {  
        mid=(low+high)/2;  
        if(arr[mid]==k)  
            i=mid;  
        else if(arr[mid]>k)  
            i=r_search(arr, low,mid-1,k);  
        else  
            i=r_search(arr, mid+1,high,k);  
    }  
    return i;  
} 





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值