【发布时间】:2018-01-20 10:27:37
【问题描述】:
关于如何将递归转换为非递归有很多问题,我也可以将一些递归程序转换为非递归形式 注意:我用的是泛化的方式(用户自定义的Stack),因为我觉得比较容易理解,而且我用的是Java,所以不能用GOTO关键字。
事情并不总是那么顺利,当我遇到回溯时,我被卡住了。例如,子集问题。我的代码在这里:recursive call with loop
当我使用用户定义的堆栈将其转换为非递归形式时。我不知道如何处理循环(在循环中存在递归调用)。
我google了一下发现有很多方法比如CPS。我知道有一个子集问题的迭代模板。但我只想使用用户定义的堆栈来解决。
有人可以提供一些线索来将这种递归(循环递归)转换为非递归形式(通过使用用户定义的堆栈,而不是 CPS 等)吗?
这是我的代码recursive to non-recusive(Inorder-Traversal),因为没有递归调用的循环,所以我可以轻松做到。同样,当具有返回值的递归程序时,我可以使用引用并将其作为参数传递给函数。从代码中,我使用堆栈模拟递归调用,并使用“状态”变量到下一个调用点(因为java不允许使用GOTO)。
以下是我收集到的信息。似乎它们都不能满足我提到的问题(有些使用 goto 不允许 java,有些是非常简单的递归意味着没有嵌套递归调用或带循环的递归调用)。
----------------------分割线------------ --------------------------
谢谢大家。在我发布问题之后......我花了一整夜才弄清楚。这是我的解决方案:non-recursive subset problem solution,代码的注释是我的想法。
总结一下。我之前坚持的是如何处理 foo-loop,实际上,我们可以简单地忽略它。因为我们使用的是loop+stack,所以可以对是否满足条件做一个简单的判断。
【问题讨论】:
标签: java algorithm recursion recursive-backtracking non-recursive