如何将递归转化为迭代?

qc6wkl3g  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(306)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

18天前关门了。
改进这个问题
我得到了一个可怕的StackOverflower错误,并认为是我的深层递归造成的(好吧,调试器帮助了……)。有人能指导我把递归变成循环吗?

H<V>.Pair currPair = (H<V>.Pair) arr[startPos];
    if (arr[startPos] == null) {
        return null;
    }

    if (currPair.key.equals(key)) {
        return currPair.value;
    } else {
        return find(gNL(startPos, ++stepNum, key), key, stepNum);
    }
}

更具体地说, return find(getNextLocation(startPos, ++stepNum, key), key, stepNum); 导致递归。

5ktev3wc

5ktev3wc1#

我相信这能让你达到目的:

private V find(int startPos, String key, int stepNum) {
    Hashtable<V>.Pair currPair = arr[startPos];
    while ((currPair != null) && !currPair.key.equals(key)) {
        stepNum++;
        int nextPos = getNextLocation(startPos, stepNum, key);
        currPair = arr[nextPos];
    }

    return (currPair == null)
            ? null
            : currPair.value;
}

“技巧”是将用于结束递归的条件放入循环条件中。请注意,由于您的算法没有像其他递归算法那样以任何方式使用中间结果,因此转换非常简单。这并不是每次都适用于所有递归算法,有时需要添加一个数据结构来保存中间结果。

q5iwbnjs

q5iwbnjs2#

这似乎相当于:

private V find(int startPos, String key, int stepNum) {

    Hashtable<V>.Pair p;
    boolean finished = false;
    do {
       p = (Hashtable<V>.Pair) arr[startPos]; 
       if (p == null || p.key.equals(key)) {          
           finished = true;
       } else {
           startPos = getNextLocation(startPos, ++stepNum, key);
       }
    } while( ! finished);

    return p == null ? null : p.value;
}

相关问题