您的位置:首页 > 其它

关于递归的简单分析

2011-06-21 23:46 246 查看
递归:(是一种分析、解决问题的思想)

递归的基本概念:

1了解分治的思想:将一个难以解决的大问题分割成一些规模较小的相同问题,以便各个击破,分而治之。如果原问题可以分割成k个子问题,1<k<=n,且这些子问题都是可以解决的,并利用这些子问题的解求出原问题的解,那么这种分支方法就是可行的。

2分治法产生的子问题往往是原问题的较小模式,在这种情况下反复使用分支手段,使子问题与原问题类型一致而起规模不断缩小,最终使子问题能够较为简单的求解。然后利用这些子问题的解最终解决原问题(这是因为原问题在分治过程中始终是依赖于子问题的,它们之间就满足一定的关系)。这样自然就产生了递归算法。

3个人认为分治思想的上述2就是递归思想的精要描述。我们在考虑是否使用递归是由上述2得出两个方面:一是,考虑原问题是否能够划分为一些子问题求解,这些子问题是否与原问题类型一致而规模缩小。2找较小问题的解(即递归的终止条件)。

4找出原问题与子问题的关系,并建立递归方程(可以使用数学语言将其描述清楚),同时找出递归方程的初始化条件以及各个变量的约束条件。

递归算法:间接或直接调用自身的算法。这个过程就要依赖于递归方程。

递归实现的基本原理:

采用栈的工作机制来实现。因为我们发现在程序递归调用的过程中需要保存当前调用的信息为上层调用多用,二且这种调用也满足先进后出原则。只有当前下层调用完成后,当前调用才能退栈。这个我们以前学过的N!采用递归实现时就建立了一系列的工作栈,通过0!=1然后层层返回值,从而层层退栈,最终解决n!问题。不过最为经典的还是汉诺塔问题。

递归解决策略:个人认为非常关键的在于通过原问题分析得出的子问题也和原问题类型一致(否则不能使用递归而应使用分治),再进行抽象总结出子问题和当前原文题的关系从而抽象出动归方程,最后弄清楚递归终止条件和约束关系。最终可依此编写出相应的算法。

递归的分析案例:

二叉树的先序递归遍历:

我们知道二叉树的定义就是一个递归定义,意味着不需要分析就可以使用递归方程。因为当二叉树有n>1个节点时,它的子树也是一颗二叉树,那么毫无疑问遍历二叉树的操作与遍历二叉树子树的操作是一样的。最小的二叉树就是一个结点它的左子树与右子树都为空,访问该结点遍历结束,于是得到了遍历二叉树的终止条件。

当前二叉树不为空时:

1遍历当前二叉树的根节点

2先序遍历该二叉树左子树

3先序遍历该二叉树右子树

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: