zoukankan      html  css  js  c++  java
  • 递归的设计和实现

    由树的遍历所想。

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

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

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

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

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

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

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

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

    仔细分析分解项。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 相关阅读:
    delete
    js混淆代码还原-js反混淆:利用js进行赋值实现
    Microservice Trade-Offs
    tagged by: microservices 【martinfowler.com】
    Tackle Business Complexity in a Microservice with DDD and CQRS Patterns
    Why Can't I Access A Protected Member From A Derived Class
    tagged by: domain driven design 【martinfowler.com】
    Domain Driven Design
    Why Would I Ever Need to Use C# Nested Classes
    RabbitMQ compare with redis and MSMQ
  • 原文地址:https://www.cnblogs.com/lsfv/p/10692059.html
Copyright © 2011-2022 走看看