2012-09-14 30 views
3

什么是检索递归调用函数的顺序的最简单的方法函数的阶数。例如,如果我们有一个递归函数,它会一直调用自己,直到找到基本大小写,然后一次返回一个函数。返回的第一个函数的顺序为0,第二个函数的顺序为1,依此类推...检索订单信息的简单方法是什么?比如说,当它是三号函数的时候,我想做一些特别的事情。获得了递归调用

编辑:我希望堆栈顶部的函数为零。

Edit2:我试图解决的问题是返回第二个元素的顺序遍历二叉树。

+0

听起来有趣,你能提供更多的细节和/或代码吗? – Pao

+0

您可以使用参数传递您为每次调用增加的参数,或者只是迭代地完成整个事件。这听起来像你想要递归树中每个节点的深度。 – oldrinb

+0

要在遍历树中查找'nnth'元素,请将计数器*传递给*和*以便从每次递归调用中取出。兄弟姐妹得到了从前面的兄弟姐妹穿过而来的计数器。 – 2012-09-14 22:44:43

回答

5

如果你开始用递归函数看起来像这样

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

+0

要添加到此,您可能需要保留原始递归函数,然后使用额外参数调用新递归函数。这样调用者(例如'main()')就不知道区别。 –

+0

有趣的是,如果我想让最深的函数(堆栈顶部的函数)为零,该怎么办? – Keeto

+0

@Keeto在下一次调用返回之前(因为您不知道它们中会有多少人),您无法知道自己的级别是否为“顶部零”。你可以从之前的调用中返回关卡,并添加一个来学习你的关卡,但是你可以只在“事实之后”这样做。 – dasblinkenlight

0
  • 如果0级应该是最后的“嵌套调用”,那么它是在普通 不可判定的问题类似停机问题,因为你不能 只是说“后3次嵌套调用时,函数将返回一个 值“。只有通过模拟特定函数的计算,才有可能展望未来。

  • 如果0级应该是第一次调用,那么它非常简单,您可以使用该级别作为方法的参数并将其增加。

顺便说一句,有趣的问题,请参见http://en.wikipedia.org/wiki/Halting_problem

3

的情况下dasblink已经给了你占地面积你的建议实施明智的,因为电平计数器,当您去的递归更深的上升(增量)相反。

如果您希望在递归更深的时候减少它,这意味着您事先知道确切的递归深度。

在大多数情况下,如果您知道确切的递归深度,您将不会使用递归,您将使用循环(for,while,repeat/until等)。事实上,在这种情况下使用递归是不太理想的,因为分配的递归栈(更高的内存消耗)和循环效率更高。

+0

+1“在大多数情况下,如果你知道确切的递归深度,你将不会使用递归”这是一个完美的观察! – dasblinkenlight

+0

大多数情况下,它使用递归函数的语法更清晰。如果这段代码需要可重用,那么无论如何你都会编写一个函数,所以大多数人(包括我自己)有时候应该是锯齿形的。 –

+1

使用递归函数可以很容易地结束堆栈溢出。您可以通过-s Stacksize或-oss Stacksize来增加堆栈。但是,每个方法调用都意味着开销,如果递归预计会很深,那么这是我们应该避免的。 –