黑马程序员 — 递归

来源:互联网 发布:域名搜索引擎注册 编辑:程序博客网 时间:2024/05/29 15:03
-------android培训、java培训、期待与您交流! ----------


递归

什么是递归:

一个函数自己直接或间接调用自己(一个函数调用另外一个函数和他调用自己是一模一样的,都是那三步,只不过在人看来有点诡异。


一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
    

    递归满足的三个条件:

  • 递归必须得有一个明确的终止条件
  • 该函数处理的数据规模必须在递减
  • 这个转化必须是可解的。
    

     循环和递归:

理论上循环能解决的,肯定可以转化为递归,但是这个
过程是复杂的数学转化过程,递归能解决不一定能转化
为循环
    
递归:
  • 易于理解
  • 速度慢
  • 存储空间大
循环:
  • 不易于理解
  • 速度快
  • 存储空间小

递归的操作步骤:

调用前

一个函数的运行期间调用另一个函数时,在运行被调用函数之前,系统需要完成3件事情
  1. 将所有的实参、返回地址等信息传递给被调用函数保存;
  2. 被调用函数局部变量分配存储区;
  3. 将控制转移到被调函数的入口。

调用中

  1. 而从被调用函数返回调用函数之前,系统也应完成3件工作:
  2. 保存被调函数的计算结果;
  3. 释放被调函数的数据区;
  4. 依照被调函数保存的返回地址将控制转移到调用函数。当有多个函数构成嵌套调用时,按照后调用先返回的原则。


递归函数的特点

所有递归函数的结构都是类似的。
  1. 函数要直接或间接调用自身。
  2. 要有递归终止条件检查,即递归终止的条件被满足后,则不再调用自身函数。
  3. 如果不满足递归终止的条件,则调用涉及递归调用的表达式。在调用函数自身时,有关终止条件的参数要发生变化,而且需向递归终止的方向变化。


总结:
函数的调用原则和数据结构栈的实现是相一致。也说明函数调用是通过栈实现的。