什么是检索递归调用函数的顺序的最简单的方法函数的阶数。例如,如果我们有一个递归函数,它会一直调用自己,直到找到基本大小写,然后一次返回一个函数。返回的第一个函数的顺序为0,第二个函数的顺序为1,依此类推...检索订单信息的简单方法是什么?比如说,当它是三号函数的时候,我想做一些特别的事情。获得了递归调用
编辑:我希望堆栈顶部的函数为零。
Edit2:我试图解决的问题是返回第二个元素的顺序遍历二叉树。
什么是检索递归调用函数的顺序的最简单的方法函数的阶数。例如,如果我们有一个递归函数,它会一直调用自己,直到找到基本大小写,然后一次返回一个函数。返回的第一个函数的顺序为0,第二个函数的顺序为1,依此类推...检索订单信息的简单方法是什么?比如说,当它是三号函数的时候,我想做一些特别的事情。获得了递归调用
编辑:我希望堆栈顶部的函数为零。
Edit2:我试图解决的问题是返回第二个元素的顺序遍历二叉树。
如果你开始用递归函数看起来像这样
void recursive(int p1, String p2, long p3) {
...
if (someCondition) {
recursive(nextP1, nextP2, nextP3);
}
}
它改成这样:
void recursive(int p1, String p2, long p3, int level) {
...
if (someCondition) {
recursive(nextP1, nextP2, nextP3, level+1);
}
}
现在通过调用
recursive(initialP1, initialP2, initialP3, 0);
开始关闭在零水平
level
将指示调用recursive
的次数在你上面。
编辑:(零在最顶部)
您也可以将函数返回其水平实行“顶部零”的策略:
int recursive(int p1, String p2, long p3) {
if (baseCase) {
return 0;
}
...
int level = 0;
if (someCondition) {
level = 1+recursive(nextP1, nextP2, nextP3);
}
return level;
}
注在这种情况下,直到最后一次递归调用返回后才能找到level
。
要添加到此,您可能需要保留原始递归函数,然后使用额外参数调用新递归函数。这样调用者(例如'main()')就不知道区别。 –
有趣的是,如果我想让最深的函数(堆栈顶部的函数)为零,该怎么办? – Keeto
@Keeto在下一次调用返回之前(因为您不知道它们中会有多少人),您无法知道自己的级别是否为“顶部零”。你可以从之前的调用中返回关卡,并添加一个来学习你的关卡,但是你可以只在“事实之后”这样做。 – dasblinkenlight
如果0级应该是最后的“嵌套调用”,那么它是在普通 不可判定的问题类似停机问题,因为你不能 只是说“后3次嵌套调用时,函数将返回一个 值“。只有通过模拟特定函数的计算,才有可能展望未来。
如果0级应该是第一次调用,那么它非常简单,您可以使用该级别作为方法的参数并将其增加。
顺便说一句,有趣的问题,请参见http://en.wikipedia.org/wiki/Halting_problem
的情况下dasblink已经给了你占地面积你的建议实施明智的,因为电平计数器,当您去的递归更深的上升(增量)相反。
如果您希望在递归更深的时候减少它,这意味着您事先知道确切的递归深度。
在大多数情况下,如果您知道确切的递归深度,您将不会使用递归,您将使用循环(for,while,repeat/until等)。事实上,在这种情况下使用递归是不太理想的,因为分配的递归栈(更高的内存消耗)和循环效率更高。
+1“在大多数情况下,如果你知道确切的递归深度,你将不会使用递归”这是一个完美的观察! – dasblinkenlight
大多数情况下,它使用递归函数的语法更清晰。如果这段代码需要可重用,那么无论如何你都会编写一个函数,所以大多数人(包括我自己)有时候应该是锯齿形的。 –
使用递归函数可以很容易地结束堆栈溢出。您可以通过-s Stacksize或-oss Stacksize来增加堆栈。但是,每个方法调用都意味着开销,如果递归预计会很深,那么这是我们应该避免的。 –
听起来有趣,你能提供更多的细节和/或代码吗? – Pao
您可以使用参数传递您为每次调用增加的参数,或者只是迭代地完成整个事件。这听起来像你想要递归树中每个节点的深度。 – oldrinb
要在遍历树中查找'nnth'元素,请将计数器*传递给*和*以便从每次递归调用中取出。兄弟姐妹得到了从前面的兄弟姐妹穿过而来的计数器。 – 2012-09-14 22:44:43