webForumDet fria alternativet

Varför fungerar inte min rekursion i båda fallen?

0 svar · 241 visningar · startad av FreeZer

FreeZerMedlem sedan jan. 2001950 inlägg
#1

Hoppas ni står ut med lite delphi här...

Jag måste få förklarat varför min rekursion fungerar olika beroende på om jag använder mig av en for eller while loop...?

arr := 'ABC','abc','123'

{ Här använder jag en for-loop och det fungerar som det ska }
procedure f1(s:string;i:integer);
var
 k:integer;
begin
  if i = 4 then form1.memo1.lines.add(s)
  else begin
    for k := 1 to length(arr[i]) do begin
      f1(s+arr[i][k],i+1);
    end;
  end;
end;

{ Här använder jag en while loop och då fungerar inte rekursionen 
som den ska, kolla utskrift }
procedure f2(s:string;i:integer);
var
 k:integer;
begin
  if i = 4 then form1.memo1.lines.add(s)
  else begin
    while arr[i] <> '' do begin
      f2(s+arr[i][1],i+1);
      arr[i] := copy(arr[i],2,length(arr[i]));
    end;
  end;
end;

[B]f1('',1);[/B] //resultat av f1
Aa1
Aa2
Aa3
Ab1
Ab2
Ab3
Ac1
Ac2
Ac3
Ba1
Ba2
Ba3
Bb1
Bb2
Bb3
Bc1
Bc2
Bc3
Ca1
Ca2
Ca3
Cb1
Cb2
Cb3
Cc1
Cc2
Cc3

[B]f2('',1);[/B] //resultat av f2
Aa1
Aa2
Aa3

Som man kan se så fungerar rekursionen fint i f1, men i f2 fungerar bara rekursionen i sista steget, alltså att 1,2 och 3 blir rätt.

Varför blir det så?

123 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
120 ms — hämta tråd, inlägg och bilagor (db)