在递归调用中检索函数顺序的最简单方法是什么。例如,如果我们有一个递归函数,它会一直调用自己,直到找到基本情况,然后一次返回一个函数。返回的第一个函数的顺序为 0,第二个函数的返回顺序为 1,依此类推...检索订单信息的简单方法是什么?比如说,当它是三阶功能时,我想做一些特别的事情。
编辑:我希望堆栈顶部的函数为零。
Edit2:我要解决的问题是返回按顺序遍历二叉树的第 n 个元素。
如果您从一个看起来像这样的递归函数开始
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
直到最后一次递归调用返回后,您才能找到您的。
dasblink 为您提供的案例与您建议的实施方式相反,因为随着递归的深入,级别计数器会上升(增量)。
如果您希望它随着递归的深入而减少,这意味着您事先知道确切的递归深度。
在大多数情况下,如果您知道确切的递归深度,您将不会使用递归,您将使用循环(for、while、repeat/until 等)。事实上,在这种情况下使用递归并不是最优的,因为递归堆栈被分配(更高的内存消耗)并且循环效率更高。
如果级别 0 应该是最后一次“嵌套调用”,那么它通常是类似于停止问题的不可判定问题,因为您不能只说“在 3 次嵌套调用之后,函数将返回一个值”。只有通过模拟特定函数的计算才能向前看。
如果 level 0 应该是第一次调用,那么它非常简单,您可以使用 level 作为方法的参数并递增它。
顺便说一句,有趣的问题,请参阅http://en.wikipedia.org/wiki/Halting_problem