数据结构 - 第三章 栈与递归

3.4 栈与递归

  • 递归的定义
  • 若一个对象部分的包含他自己,或用它自己给自己定义,则称这个对象是递归的。
  • 若一个过程直接或间接地调用自己,则称这个过程是递归的过程。
/*例如:求递归n的阶乘
long Fact(long n)
{
    if(n == 0)
    {
        return 1;
    }
    else
    {
         return n*(Fact(n-1));
    }
}

数据结构 - 第三章 栈与递归_第1张图片
数据结构 - 第三章 栈与递归_第2张图片
数据结构 - 第三章 栈与递归_第3张图片
数据结构 - 第三章 栈与递归_第4张图片

递归问题 - 分治法求解

分治法:对于一个较为复杂的问题,能够分解成几个相对简单的且解法相同或类似的子问题来求解。

必备的三个条件

 1. 能够一个问题转换成另一个新问题,而新问题与原问题的解法相同或类同。不同的仅是处理的对象,且这些处理对象是变化有规律的。
 2. 可通过上述的转化而使问题简化
 3. 必须有一个明确的递归的出口,或者是递归边界。

分治法求解递归问题算法的一般形式:
void p(参数表)
{
    if(递归结束条件) 可直接求解步骤;      ----------基本项
    else p;(较小的参数)                ----------归纳项
}
/*********例如**********/
long Fact(long n)             //Fact 为自己定义的函数
{
    if(n == 0)
    {
        return 1;
    }
    else
    {
         return n*(Fact(n-1));
    }
}

 - 函数调用过程
 - 调用前,系统完成:
(1)将实参,返回地址等传递给被调用函数
(2)为被调用函数的局部变量分配储存区
(3)将控制转移到被调用函数的入口
调用后,系统完成:
(1)保存被调用函数的计算结果
(2)释放被调用函数的数据区
(3)依照被调用函数保存的返回地址将控制转移到调用函数

数据结构 - 第三章 栈与递归_第5张图片
数据结构 - 第三章 栈与递归_第6张图片
数据结构 - 第三章 栈与递归_第7张图片
数据结构 - 第三章 栈与递归_第8张图片

  • 递归的优缺点
优点:结构清晰,程序易读
缺点:每次调用生成工作记录,保存状态信息,入栈,返回时,要出栈,恢复状态信息,时间开销大。

递归->非递归
方法1.尾递归,单项递归->循环结构
方法2.自用栈模拟系统的运行时栈

数据结构 - 第三章 栈与递归_第9张图片
数据结构 - 第三章 栈与递归_第10张图片
数据结构 - 第三章 栈与递归_第11张图片
数据结构 - 第三章 栈与递归_第12张图片

你可能感兴趣的:(数据结构,数据结构,算法)