在Delphi中:如何在不使用参数的情况下找到递归深度?

时间:2010-09-23 11:45:58

标签: delphi recursion

当我创建递归方法时,我经常包含一个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>);

还有其他方法可以轻松找到深度吗?

5 个答案:

答案 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。