当我创建递归方法时,我经常包含一个Depth参数,特别是当我需要某种救助机制时。代码通常是这样的
procedure Recurse(<Params>; aDepth : integer = 0);
begin
if aDepth > SomeLimit then
begin
//Tidy up, return best result found>
exit;
end;
<stuff>
if <Condition> then
Recurse(<Params>; aDepth+1)
else
begin
//Tidy up, return result of endnode>
end;
end;
我称之为没有深度参数
Recurse(<Params>);
还有其他方法可以轻松找到深度吗?
答案 0 :(得分:7)
如果你有办法走栈,看看你的功能入口点在那里多少次,我想你可以这样做。但是你会注意到你的aDepth参数也是正确的,你会发现aDepth比窥探堆栈更简单,更麻烦。
IMO,简单的解决方案在这里是最好的,它是便携式和面向未来的,不像你可以发明的任何堆栈侦听解决方案。
所以,是的,还有其他方法,但你最初的解决方案是最好的,IMO。
答案 1 :(得分:2)
在过程中声明一个类型化常量。确保将compile选项设置为允许更改常量。
procedure Recurse;
const
aDepth : integer = 0;
begin
aDepth := aDepth + 1;
try
if aDepth > SomeLimit then
begin
//Tidy up, return best result found>
exit;
end;
<stuff>
if <Condition> then
Recurse
else
begin
//Tidy up, return result of endnode>
end;
finally
aDepth := aDepth - 1;
end;
end;
答案 2 :(得分:0)
有一个可以计算递归的全局变量吗?否则没有 - 递归只是用一些参数调用一些方法。
答案 3 :(得分:0)
在C ++中,我能够做到这一点
class recursion_guard
{
public:
recursion_guard() { depth_count++; }
~recursion_guard() { depth_count--; }
static int depth_count;
};
int recursion_guard::depth_count = 0;
void recurse(recursion_guard a = recursion_guard())
{
if(recursion_guard::depth_count > 100)
return;
recurse();
}
但是由于Object Pascal中的对象总是在堆上分配,我想知道是否可以使用带有默认参数的String而不管它的引用计数
const
MyRecursionGuardConstString: string = "whatever";
procedure Recurse(RecursionGuard: string = MyRecursionGuardConstString)
begin
if GetRefCount(MyRecursionGuardConstString) > 100 then //o_o
exit;
end;
Recurse;
end;
答案 4 :(得分:0)
type
TMyRecursion = class
private
nDepth: integer;
public
constructor Create;
procedure Recursion(...)
end;
在构造函数中,您必须初始化nDepth。