Na, super, fast eine Endrekursion.
Einfach einen Stack, bestehend aus 2 Strings erzeugen (Ich hab das als TStringlist gemacht, nicht perfekt, reicht aber).
Am Anfang schiebst Du 'init' und 'str' auf rauf. Anstatt rekursiv aufzurufen, schiebst Du die Parameter, mit der Du dich sonst rekursiv aufrufen würdest, einfach auf den Stack. Ich gehe mal davon aus, das Du das Ergebnis des rekursiven Aufrufes in der For-Schleife nicht benötigst. Ich sehe auch einige globale Variablen, aber das checkst Du bestimmt selbst.
Delphi-Quellcode:
procedure IterativeBruteForceFunc(const init, str: string);
var i: integer;
npw: string;
StackedInit, StackedStr : TStringlist;
begin
StackedInit := TStringList.Create;
StackedStr := TStringlist.Create;
StackedInit.Add (init);
StackedStr.Add (Str);
While StackedInit.Count > 0 do begin
(****************************************)
Init := StackedInit [StackedInit.Count -1];
Str := StackedStr[StackedStr.count - 1];
StackedInit.Delete (StackedInit.Count - 1);
StackedStr.Delete (StackedStr.Count - 1);
(****************************************)
if slResult.Count >= BatchSize then begin
if Assigned (KeyList) then KeyList.AddStrings(slResult);
csThreadCounter.Enter;
Progress := Progress + slResult.Count;
csThreadCounter.Leave;
slResult.Clear;
end;
for i := 1 to Length (str) do begin
npw := init + str[i];
if Length (npw) >= fStartLength then begin
slResult.Add(npw);
ThreadInfo[arrayID].Progress := ThreadInfo[arrayID].Progress + 1;
end;
if Length (npw) < fEndLength then Begin
(*****************************************)
StackedInit.Add (Npw); // BruteForceFunc (npw, str);
StackedStr.Add (Str);
(*****************************************)
end;
end;
End;
End;