函数的递归调用

递归

C通过运行时堆栈支持递归函数的实现。递归函数就是直接或者间接调用自身的函数。在函数中直接调用函数本身称为直接递归调用,在函数中调用其他函数,其他函数又调用原函数,称为间接递归调用。

f()            a()        b()
{ ...          {...      {...
  调用f()      调用b()a()
  ...           ...       ...
}               }         }
直接递归调用    间接递归调用

递归算法具有两个基本特征:
(1)递推归纳。将问题转化为比原问题规模小的同类问题,归纳出一般递推公式。
(2)递归终止。当规模小道一定程度是应结束递归调用,逐层返回。常用条件语句来控制何时结束递归。
例:用递归计算斐波那契数
有的方法是用简单循环来代替递归,但这会使效率下降非常多。要记住,在使用递归实现一个函数之前,先问问你自己使用递归的好处是否抵得上它的代价。

long fibonacci(int n)
{  long result;
   long previous_result;
   long next_older_result;
   result=previous_result=1;
   while(n>2)
   {
    n-=1;
    next_older_result=previous_result;
    previous_result=result;
    result=previous_result+next_older_result;
  }
  return result;
 }

递归调用的执行分为两个阶段。第一层是逐层调用,调用的是函数自身。第二阶段是逐层返回,返回到调用该层的位置继续执行后续操作。递归调用的是多重嵌套调用的一种特殊情况,每层都要用堆栈保护主调层的现场和返回地址。调用的层数一般比较多。递归调用的层数称为递归的深度。
如果对递归很有兴趣,还有汉诺塔(hanoi)这种典型的递归问题值得看看。
通过使用递归算法,用一个并不复杂的程序解决了一个很复杂的问题。掌握好这种思维方式,对以后处理类似问题有很大帮助。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值