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