图形辅助,理解递归

对大多数程序员来讲,递归算法都不算陌生。甚至不少时候,使用递归算法解决一些简单问题是基础教材的起步课程。可是,当递归算法遇到稍微复杂的数据结构,如二叉搜索树的时候。别说让你直接写出算法,就是把标准答案摆在你的面前让你理解,咱们恐怕都会抓耳挠腮。若是你也有相似的困扰请不要灰心,由于包括我在内几乎我遇到的每个码农在这些方面都显得束手无策。究其缘由,我认为这实际上是认知心理的一种表现——咱们没法胜任同时正向思考与反向记忆——大多数的时候,咱们能够轻松应付函数的一层层递进,却很难记住每一层的返回值。终于我发现经过一种简单而有效的图形结构可让咱们理解各种递归算法,下面进入正题。程序员

定义在一个标准的二叉搜索树算法中包含一个方法以获取小于某一个键值Key的最大节点对象:算法

/**
 * Node包含一个键值对<Key extends Comparable<Key>, Value>
 * 以及一棵左子树和一棵右子树Node left, right
 *
 * class Node {
 *     private Key key;
 *    private Value val;
 *    private Node left, right;
 * }
 */
Node floor(Node n, Key key) {
    if (n == null) {
        return null;
    }
    int cmp = key.compareTo(n.key);
    if (cmp == 0) {
        return n;
    } else if (cmp < 0) {
        return floor(n.left, key);
    } else {
        Node r = floor(n.right, key);
        if (r != null) {
            return r;
        } else {
            return n;
        }
    }
}

算法不复杂,对二叉搜索树不太了解的能够先去熟悉一下数据结构。但是想读懂这几行代码确实令我头疼,毕竟若是读不懂就不可能记住更不可能在须要的时候本身写出来。接下来就是见证奇迹的时刻:数据结构

首先,任何一种递归算法都必然包含四种要素:输入,输出,递归条件和终止条件。floor方法含有两个递归条件cmp<0和cmp>0以及三个终止条件n==null, cmp==0和r==null。函数

其次,咱们将要经过简单的图形来表明层层的递归顺序,而且帮助咱们在达到终止条件的时候记录返回值。若是在稿纸上绘制甚至还能够更简洁一些。spa

如下是一个完整的演示: Node(H) floor( Node(S), Key(J) )3d

跟着floor方法绘制递归图你大概应该得到和我相似的结果:code

是否是感受瞬间思路清晰了!若是你也以为这样的方法对你有所帮助或者还有更好的建议不妨在留言中分享出来。对象

相关文章
相关标签/搜索