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

来源:互联网 发布:淘宝上哪家光威是正品 编辑:程序博客网 时间:2024/05/01 01:16

    在看严蔚敏的数据结构视频,在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;    }}

0 0
原创粉丝点击