Function 如何从递归函数delphi/pascal返回布尔值

Function 如何从递归函数delphi/pascal返回布尔值,function,validation,delphi,recursion,parameter-passing,Function,Validation,Delphi,Recursion,Parameter Passing,我正在制作一个用于学习的程序,这就是为什么我使用递归来获得更多分数,尽管迭代方法更可行。我已经做了这个算法来验证电子邮件地址,以确保它的格式L@L.L.我使用递归来验证每个实例中的每个字符。一旦递归到达步骤6,那么电子邮件是有效的,否则我希望函数返回false。有人能帮我解决这个问题吗?因为我当前的解决方案必须使用全局变量,否则每个实例都会将局部变量重置为false。我知道这个算法并不完美,但我真的不想使用全局变量,因为它将是大型程序的一部分 我不知道如何做的一些可能的解决方案: 1.通过递归的

我正在制作一个用于学习的程序,这就是为什么我使用递归来获得更多分数,尽管迭代方法更可行。我已经做了这个算法来验证电子邮件地址,以确保它的格式L@L.L.我使用递归来验证每个实例中的每个字符。一旦递归到达步骤6,那么电子邮件是有效的,否则我希望函数返回false。有人能帮我解决这个问题吗?因为我当前的解决方案必须使用全局变量,否则每个实例都会将局部变量重置为false。我知道这个算法并不完美,但我真的不想使用全局变量,因为它将是大型程序的一部分

我不知道如何做的一些可能的解决方案: 1.通过递归的每个实例传递一个布尔值,并在最后一个实例中将其设置为true。这可以由ref或val使用吗?然后通过堆栈将其传递回去 2.使用局部变量作为函数的局部变量,而不是在执行过程中不会更改的每个实例

无论如何,代码如下:

var
  Valid:boolean;

Function ValidEmail(Email:string; I:integer; Step:integer):boolean;
const
  AlphaChars=['a'..'z', 'A'..'Z'];
begin
    case Step of
      1:If Email[I] in AlphaChars then
        ValidEmail(Email, I+1, 2);
      2:If Email[I] in AlphaChars then
          ValidEmail(Email, I+1, 2)
        else if Email[I] = '@' then
          ValidEmail(Email, I+1, 3);
      3:If Email[I] in AlphaChars then
        ValidEmail(Email, I+1, 4);
      4:If Email[I] in AlphaChars then
        ValidEmail(Email, I+1, 4)
        else if Email[I]='.' then
          ValidEmail(Email, I+1, 5);
      5:If Email[I] in AlphaChars then
        ValidEmail(Email, I+1, 6);
      6:Valid:=True;
    end;
  if Valid then
    ValidEmail:=true;
  end;

电子邮件是从主程序传递的电子邮件,I是每个字符的计数,步骤是验证过程中的距离。

我想这可能就是您的意思:

Function ValidEmail(Email:string; I:integer; Step:integer):boolean;
const
  AlphaChars=['a'..'z', 'A'..'Z'];
begin
    case Step of
      1:If Email[I] in AlphaChars then
        Result := ValidEmail(Email, I+1, 2);
      2:If Email[I] in AlphaChars then
          Result := ValidEmail(Email, I+1, 2)
        else if Email[I] = '@' then
          Result := ValidEmail(Email, I+1, 3);
      3:If Email[I] in AlphaChars then
        Result := ValidEmail(Email, I+1, 4);
      4:If Email[I] in AlphaChars then
        Result := ValidEmail(Email, I+1, 4)
        else if Email[I]='.' then
          Result := ValidEmail(Email, I+1, 5);
      5:If Email[I] in AlphaChars then
        Result := ValidEmail(Email, I+1, 6);
      //6:
      else
        Result := True;
    end;
  end;
请注意,这不依赖于任何全局变量-您可以按照

Function ValidEmail(Email:string; I:integer; Step:integer):boolean;
const
  AlphaChars=['a'..'z', 'A'..'Z'];
begin
    case Step of
    ...
    7 : Result := ValidEmail(EMail, i, SomeOtherStep);
      else
        Result := True;
    end;
  end;

好的,根据克雷格的评论,我修改了算法,允许数字等

Function ValidEmail(Email:string; I:integer; Step:integer):boolean;
const
  AlphaChars=['a'..'z', 'A'..'Z'];
  IntChars=['1'..'9'];
  CharChars=['!', '#', '$', '%' ,'&', '*', '+', '-', '/', '=', '?', '^', '_', '`', '{', '|'
   , '}',        '~', '.'];
begin
case Step of
  1:If (Email[I] in AlphaChars) or (Email[I] in IntChars) or (Email[I] in CharChars)then
    Result := ValidEmail(Email, I+1, 2);
  2:If (Email[I] in AlphaChars) or (Email[I] in IntChars) or (Email[I] in CharChars)then
    Result := ValidEmail(Email, I+1, 2)
    else if Email[I] = '@' then
      Result := ValidEmail(Email, I+1, 3);
  3:If (Email[I]= '-' ) or (Email[I] in AlphaChars) or (Email[I] in IntChars) then
      Result:=ValidEmail(Email, I+1, 4);
  4:If (Email[I]= '-' ) or (Email[I] in AlphaChars) or (Email[I] in IntChars) then
      Result:=ValidEmail(Email, I+1, 4)
    else if Email[I]='.' then
      Result := true;
  else
      Result:=false;
end;
end;

请注意,虽然
ValidEmail:=True
是一种有效的语法,但Delphi中首选的语法(据我所知)是
Result:=True
。我几乎从未见过使用
:=
语法的代码。好的,谢谢,我知道,但我不知道这是首选方法,从现在起我将使用它。谢谢。我需要警告您,您的代码将错误地拒绝大量有效的电子邮件地址。。。您忽略了许多有效字符:
0..9、+、-、
甚至
在电子邮件地址的名称部分也是有效的,并且通常是公司的政策。此外,您似乎只允许在域部分中使用一个
。试图重新发明轮子的一个问题是,有时你重新发明的轮子不正确。如果这是针对生产系统的,您最好不要验证地址,而不要让它无法捕获有效的地址。现在可以和其他角色一起使用了谢谢你的帮助,我真不敢相信我错过了!如果电子邮件未发送,则应在开始时将结果显式设置为Falsevalid@kbickar:这只是为了说明一个特定的点-它不是指产品质量代码。另外,使用您提出的第二种方法的优点是什么,或者第一种方法更好?谢谢你的快速回复