如何使用堆栈将以下代码替换为非递归?

时间:2011-10-17 12:57:54

标签: java recursion tail-recursion state-machine

这是一台有限状态机:

private int recursive(int rc, int pc, int sc) {
    for (;;) {
        Instruction actual = program[rc][pc];
        switch (actual.type) {
            case FIRST:
                if (sc >= input.length || input[sc] != actual.c1) return -1;
                pc++; sc++;
                continue;
            case SECOND:
                pc = actual.n1;
                continue;
            case THIRD:
                int result = recursive(rc, actual.n1, sc);
                if (result != -1) return result;
                pc = actual.n2;
                continue;
            case FOURTH:
                result = recursive(actual.n1, 0, sc);
                if (result == -1) return -1;
                pc++; sc = result;
                continue;
            case FIFTH:
                if (sc == input.length) return sc;
                return -1;
        }
        return -1;
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

考虑递归。当您以递归方式调用方法时,实际上调用方法并将某个方法的先前调用的状态存储在某处。你在哪里存放这个州?答案是“堆叠”。但是当您使用递归调用时,系统会为您管理堆栈。

所以,你必须自己管理它。这意味着以下内容。在第一次方法调用之前创建堆栈。更改方法的签名:它应该接受堆栈作为参数。堆栈应包含您的状态。在不检查代码的情况下,它可以是原始对象或复杂对象。如果您需要复杂的对象创建自己的类State,那将包含所有需要的信息。

我希望这就够了。祝你好运!