将递归方法写入非递归方法(java)

时间:2014-11-14 01:43:40

标签: java recursion

我对理解递归是如何工作有点困惑。

基本上我必须用非递归方法替换递归方法。

例如,这是递归方法:

public Key min() {
    if (isEmpty()) {
        return null;
    }
    return min(root).key;
}

private Node min(Node x) {
    if (x.left == null) {
        return x;
    } else {
        return min(x.left);
    }
}

public Key max() {
    if (isEmpty()) {
        return null;
    }
    return max(root).key;
}

private Node max(Node x) {
    if (x.right == null) {
        return x;
    } else {
        return max(x.right);
    }
}

public Key floor(Key key) {
    Node x = floor(root, key);
    if (x == null) {
        return null;
    } else {
        return x.key;
    }
}

private Node floor(Node x, Key key) {
    if (x == null) {
        return null;
    }
    int cmp = key.compareTo(x.key);
    if (cmp == 0) {
        return x;
    }
    if (cmp < 0) {
        return floor(x.left, key);
    }
    Node t = floor(x.right, key);
    if (t != null) {
        return t;
    } else {
        return x;
    }
}

public Key ceiling(Key key) {
    Node x = ceiling(root, key);
    if (x == null) {
        return null;
    } else {
        return x.key;
    }
}

private Node ceiling(Node x, Key key) {
    if (x == null) {
        return null;
    }
    int cmp = key.compareTo(x.key);
    if (cmp == 0) {
        return x;
    }
    if (cmp < 0) {
        Node t = ceiling(x.left, key);
        if (t != null) {
            return t;
        } else {
            return x;
        }
    }
    return ceiling(x.right, key);
}

这是我尝试非递归地执行此操作:

public Key min() {
    if (isEmpty()) {
        return null;
    }
    return min(root).key;
}

private Node min(Node x) {

    while (x.left !=null){
         x = x.left; 
    }
    return x;
}

public Key max() {
    if (isEmpty()) {
        return null;
    }
    return max(root).key;
}

private Node max(Node x) {
    while (x.right!=null){
        x = x.right;
    }
    return x;
}

public Key floor(Key key) {
    Node x = floor(root, key);
    if (x == null) {
        return null;
    } else {
        return x.key;
    }
}

private Node floor(Node x, Key key) {
    if (x == null) {
        return null;
    }
    int cmp = key.compareTo(x.key);
    if (cmp == 0) {
        return x;
    }
    if (cmp < 0) {
        while (x.left != null){
            x = x.left;
            if (x ==null){
                return null;
            }
        }
    }
    Node t = x.right;
    while (x.right != null){
        x = x.right;
        if (x == null){
            return null;
        }
    }
    if (t != null){
        return t;
    }
    else{
        return x;
    }
}

我只是问我是否有正确的想法。

1 个答案:

答案 0 :(得分:0)

是的,你有正确的想法。

private Node min(Node x) {
    if (x.left == null) {
        return x;
    } else {
        return min(x.left);
    }
}

这是上述函数的良好非递归解决方案。

private Node min(Node x) {

    while (x.left !=null){
         x = x.left; 
    }
    return x;
}

你应该看一下http://en.wikipedia.org/wiki/Dynamic_programming,特别是Memoization。

编辑:另请参阅类似的主题:Way to go from recursion to iteration