我只是想知道,是否可以将此递归函数转换为非递归函数
unsigned Parser::Not(unsigned eff)
{
if (eff == 0) return 1;
if (eff == 1) return 0;
Node rn(ri.get_key(eff));
rn.t_branch_id = Not(rn.t_branch_id);
rn.f_branch_id = Not(rn.f_branch_id);
return CodeRuleNode(rn);
}
答案 0 :(得分:8)
是。您可以通过实现自己的堆栈来跟踪状态,从而将任何递归函数转换为非递归函数。
答案 1 :(得分:1)
有可能,是的。但是,如果没有Node类中的父引用,那将很困难,并且需要一个当前节点的向量(模拟堆栈)。如果您可以更改Node类以包含对父类的引用,这将使迭代更容易,因为模拟堆栈隐含在树定义中。
然而,像这样生成树深度是一个完美的递归工作,因为它更易于读写,因此不易出错。
答案 2 :(得分:0)
任何递归函数都可以非递归方式编写。但是,您需要使用堆栈或其他数据结构来跟踪您访问过的节点。
答案 3 :(得分:0)
是的,我认为这是可能的。任何递归函数都可以转换为非递归函数。
但如果RETURN
命令是递归函数中的最后一个命令,则必须使用堆栈,否则无需使用堆栈。