递归的设计和实现

由树的遍历所想。

仔细分析它如何实现的。是否真的一眼那么简单。

怪不得再次看到它的时候。并没有真正的秒懂,回想起来当时搞懂,是反推它的计算而已。就是画个树,套代码,发现代码的流程正确。就完事了。呵呵。

//中序遍历
    public void midOrder(TreeNode root){
        if(root != null){
            midOrder(root.left);
            System.out.print(root.val + "\t");
            midOrder(root.right);
        }
    }

递归必须有基本问题。但常见的代码中,基本问题被省略了。非省略代码如下:

//中序遍历
    public void midOrder(TreeNode root){
        if(root != null){
            midOrder(root.left);
            System.out.print(root.val + "\t");
            midOrder(root.right);
        }
        else
        {
        }        

对,基本问题就是节点为空。

 

递归的2要素,1,问题的分解 2.基本问题。

问题的分解。分解为:遍历左子树,访问顶点,遍历右子树

仔细分析分解项。

会发现有10种情况。10中情况,为什么代码那么简单,其他情况呢?

红色的5中情况,可以明显的看出来不属于基本问题。

而另外5种情况,是可以作为基本问题的。但是其中一些基本问题,可以转化为某个递归问题和基本问题的组合。

所以,最终基本问题,可以压缩到一个,而只要保证,使用到的基本问题和递归问题被写出来。

而递归问题也可以再次压缩

所以最终10种情况,居然只要存在1种基本情况和1种递归情况。就可以推导出树的全部10中情况的组合。

所以,最终感受一下,模型的简洁。导致代码的简洁。不需要判断,左右子树,是否为空,为叶子。等各种组合。

但这样的简洁也并不是自然而然的。除非你抽象能力很强。秒推出来了组合。

 

设计一个稍微复杂的递归:

1.把问题分解为子问题的组合。

2.列出所有组合的模型,并分为基本模型和递归模型。

3.可以先压缩基本模型(利用一个递归模型和一个基本模型,被利用的模型要标记一下,被置为暂时必须模型)

4.再压缩递归模型(利用递归模型和基本模型,被利用的模型要标记一下,被置为暂时必须模型)

5.可以重复3,4步骤。使得模型最精简化。

自己的总结,感觉理论上是正确的。

 

posted @ 2019-04-11 20:03  琴鸟  阅读(789)  评论(0编辑  收藏  举报