我正在制作一个用于学习目的的程序,这就是为什么我使用递归来获得更多标记,尽管迭代方法会更加可行 . 我已经使这个算法验证了一个电子邮件地址,以确保它的格式为L@L.L.我正在使用递归来验证每个实例中的每个char . 一旦递归到达步骤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;
如果电子邮件是从主程序传递的电子邮件,则我是每个字符的计数,步骤是您的验证程度 .
2 回答
我想这可能是你的意思:
请注意,这不依赖于任何全局变量 - 您可以按行递归调用ValidEmail
好的,根据克雷格的评论,我修改了算法以允许数字等 .