2011-10-17 62 views
-4

这是一个有限状态机:如何使用堆栈将以下代码替换为非递归?

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; 
    } 
} 

感谢您的帮助。

+2

这真的不是一个“为我写代码”的网站。尝试一些事情,然后回来具体问题。 – retrodrone 2011-10-17 12:59:34

+0

我很抱歉,但对我来说这是一个非常难的问题 – 2011-10-17 13:03:41

回答

1

想想递归。当你递归地调用方法时,你实际调用方法并在某处存储以前调用同一方法的状态。你在哪里存储这个状态?答案是“叠加”。但是当你使用递归调用时,系统会为你管理堆栈。

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

我希望这已经足够。祝你好运!