严蔚敏-数据结构-递归算法总结

    在看严蔚敏的数据结构视频,在32课时的时候,对递归算法进行了总结。在网上没找到对应的资料。而严蔚敏老师总结的又很不错,所以觉得有必要这里记录下(不是完全照搬,详细可以去找对应的视频)。一共有5点。

    1、递归特性,一般都是可以分解成相同的小问题,同时解又可以归并。注意:递归,一定有个结束的时候(即要关注结束条件);还有注意参数的对应关系。

    2、递归的实现,用的是“栈”。所以,递归,一定可以通过“栈”来转化为非递归实现。而栈的非递归函数肯定可以改写为递归实现。需要注意:递归的层次,决定了存储量的大小。

    3、递归树是递归算法的分析工具。“递归树”深度是递归深度;递归树的节点数,正好是递归执行操作的次数;若递归树是单支的(阶乘问题)或者递归树中有许多重复节点(斐波那契数列求解),那么不适合用递归。

    4、递归中的尾递归是很容易消除的。递归,许多适合是因为需要保存在进入函数之前的数据,在函数出来之后再用。但是,尾递归的话,是最后一个调用函数,所以不需要保存进入函数之前的数据了,所以可以直接消除。比如,二叉树的遍历(中序、先序)访问右子树可以用循环的。具体可以看最后的例子。

     5、可以用递归方程来表示递归函数的时间性能。(不是很明白)例子是

          汉诺塔问题时间是:T(n)=2T(n-1)+c;   T(0) = 0;


 下面,是第4点的例子:

//二叉树先序遍历;
//递归;
void preOrderTraverse(BiTree T)
{
    visit(T->data);
    preOrderTraverse(T->lchild);
    preOrderTraverse(T->lrchild);
}
//由于访问右子树是尾递归,所以可以消除.
void preOrderTraverse(BiTree T)
{
    while (T)
    {
        visit(T->data);
        preOrderTraverse(T->lchild);
        T = T->rchild;
    }
}

    原文作者:递归算法
    原文地址: https://blog.csdn.net/cainiaohhf/article/details/17421807
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞