关于递归的若干问题

     编程中,一个很重要的方法是递归。

     递归:简单来说,自己调用自己。可以将一个较大的问题分解为同类较小规模的问题,有下到上一一求解。即:大规模---同类小规模---解决。

    一、递归条件:

           1.调用递归函数。一般都是在main函数中调用递归函数。

           2.某些条件下,递归函数不再调用自己,结束当前函数的执行。

           3.趋近于递归函数不再调用自己的条件。

           例如 求最大公约数的公式便符合递归条件,可以用递归实现: 有两个数M,N,则它们的最大公约数gcd 为:

          gcd      =     N                    ,  M  % N = 0;

                              gcd(N, R)     , M  % N = R;


二、栈结构问题

       递归可能带来的最大问题是:可能会发生栈溢出(非正常递归-----即无限递归)。 所以必须清楚下面三个点:

      1.无限递归如何结束?这里必须满足递归的三个条件:调用递归,在一定条件下不调用自身,让后续调用趋近于结束。

      2.递归函数的变量不要太大。

      3.递归层数要有预期。


三、递归适用的问题

     1.某一类数学公式。例如上述的最大公约数,求阶乘等等。

     2.数据结构操作。

    3.算法问题。

 

四、实例

    1.正向打印一个数的每一位数:这个问题如果用非递归方式比较难以想像,如果用递归实现则简单又清晰。代码如下:

      这里若把第7行和第8行的顺序颠倒,则本函数实现的是倒序打印。如果是这样的话,比较容易用循环实现。

大体实现如下:

for(; num != 0; num /= 10)

{

printf("%d ", num % 10);

}


       2.求各位数的和:将问题1的第7,8行改为  return print_num(num / 10) + num % 10;即可实现。

       3.strlen函数的递归实现:求字符串长度。代码实现如下:


      这里第7行就是递归调用,这里的加一很关键。


五、递归优缺点

      优点:简洁,直观,清晰

      缺点:开销大,耗费时间空间栈;

                  时空效率偏低易产生大量重复计算;

        

    最后,我得到了一个启发:写程序效率高,不代表运行效率高。









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值