rekurencja...

0

Robię program, który wymaga "przejechania" się po wnętrzu katalogu (wszystkie pliki we wszystkich podkatalogach). Przeczytałem to:

I teraz tak:

  • jest tam napisane, że rekurencja ta nie uwzględnia "." (kropki - wyjścia w katalog wyżej). Skoro tak, to weźmy taką sytuację:

Katalog1
Katalog2

  • Podkatalog1
  • Podkatalog2
    Katalog 3

Czy katalog 3 będzie uwzględiony... bo mi się wydaje, że nie..

  • Pytanie odnośnie samej postaci rekurencji:

procedure costam(sciezka: string)
begin
// polecenia
costam(jakas sciezka)
// polecenia 2
end;

Procedura już w pierwszym egzemplarzu uruchmomienia przechodzi "sama do siebie" - ale czy "polecenia2" będą kiedykolwiek wykonane?

PS: W pierwszym myślniku mowa była o tej procedurze:

<delphi> procedure TMainForm.SearchDir(StartPath: String); var SR: TSearchRec; Found : Integer;

function IsDir(Value : String) : String;
begin
if Value[Length(Value)] <> '\' then
Result := Value + '\' else Result := Value;
end;

begin
Found := FindFirst(IsDir(StartPath) + '.', faDirectory, SR);
while Found = 0 do
begin
Application.ProcessMessages;
if ((SR.Attr and faDirectory) = faDirectory) and
((SR.Name <> '.') and (SR.Name <> '..')) then
begin
ListBox1.Items.Add(IsDir(StartPath) + SR.Name);
SearchDir(IsDir(StartPath) + SR.Name); {<-- w tym miejscu następuje wywołanie
samej siebie }
end;
Found := FindNext(SR);
end;
FindClose(SR);
end;
<delphi>

0

Nie widzę żadnego problemu.
Katalog1
Katalog2

  • Podkatalog1
  • Podkatalog2
    Katalog 3

Najpierw odczytywany jest Katalog1. I funkcja jest wywoływana dla niego. Ponieważ wew. Katalog1 nie ma żadego katalogu to funkcja kończy działanie i wracamy do głównej funkcji
Następnie to samo jest wykonywane dla Katalog2. Tutaj znajdowany jest Podkatalog1 i funkcja jest wywoływana dla niego. Ponieważ nic nie znaleziono to wracamy do funkcji dla Katalog2. Dalej w tej funkcji jest Podkatalog2 i dla niego znowu jest funkcja wywoływana. Potem powrór z funkcji dla Podkatalog2. Dalej powrót dla funkcje dla Katalog2 i jesteś my w głównej funkcji, gdzie wywołujemy ostatecznie dla Katalog3.

Spójrz na to tak jak jest w rzeczywistośći. W momencie, gdy jest wywoływana funkcja na stosie ląduje adres miejsca następnego do wykonania po tej linijce kodu. Dzięki temu jak kończymy wywołaną funkcję zaczynamy od tego samego miejsca.

Nie wiem jak mam to bardziej wytłumaczyć. To zwykła rekurencja (jednej funkcji). Mam przeprowadzić dowód poprawności algorytmu?

0

Nie trzeba Dryo... nie studiuje informatyki - nie znam się na takich rzeczach :-/
/* Całe szczęście. Nienawidzę dowodów ;-) */
Dzieki i podrawiam :-)

0

Hmm dziwna sprawa: sciągnąłem kod z "algorytmy" autorstwa Adama Boducha, przy próbie komplilacjiu\ występuje kilka razy:

<font color="green">[Error] Unit1.pas(35): Illegal character in input file: '' ($5C)</span>

Przy takich liniach:

<font color="blue">if Value[Length(Value)] <> </b>'\' then

Found := FindFirst(IsDir(StartPath) + </b>'.', faDirectory, SR);</span>
... itd.

Przypuszczam, że chodzi o jakieś dyrektywy kompilatora... plis help :-/

0

bo powinno byc tak:

if Value[Length(Value)] <> '\' then
Found := FindFirst(IsDir(StartPath) + '.', faDirectory, SR);

o ile sie nie myle, jakby jeszcze ne dzialalo to poprobuj pokasowac znaczki . Zauwazylem ze to jest blad na tej stronie, ze dodaje sie nieraz znaczek

0

Znaki zostały usunięte - program się skompilował. Wstawiłem ListBox1 na formę i

Teraz:

procedure TForm1.Button1Click(Sender: TObject);
begin
SearchDir('c:');
end;

Do listy nie jest dodawany żaden katalog.. co robię źle ?

0

if Value[Length(Value)] <> <font color="red">'\'</span> then

Tam gdzie masz '\' wstaw tylko ''

Found := FindFirst(IsDir(StartPath) + '.', faDirectory, SR);
((SR.Name <> '.') and (SR.Name <> '..')) then

Tu pousuwaj wszystkie '' (dosłownie wszystkie!)

[dopisane]
U mnie działa elegancko :-P

0

Aby nie było problemów z \ Adam w końcu włączył opcję na serwerze, ale stare artykuły miały podwójne \ wpisane, aby dobrze wyświetlało. Teraz trzeba to zmieniać.
Jak możesz to utwórz w Developer nowy temat, w którym będą podawane linki do stron ze złym kodowaniem, to się poprawi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1