Chtěl bych v Pascalu udělat rekurzivní metodu a nastavit v ní někde if not nalezenoReseni the begin ...příkazy... end;, tzn. to co provádí ta procedure se provede jen pokud ta proměnná nalezenoReseni neni true. problém je, že ji kvůli tomu potřbuju jako globální proměnnou, nemohu ji předávat té proceduře. Jak se to dá udělat?
Fórum › Pascal
Rekurze s globální proměnnou
nejde pouzit to ze kdyz najdes reseni tak nevyvolas dalsi rekurzi a ukoncis to?
tim padem skonci i vsechny pred tim...
mimo to globalni promenne jsou v sekci var nekde kousek pod program ...;
a ty tam mas neco jako:
procedure neco;
begin
while ( not nalezenoreseni ) do neco;
end;
pokud je tam ale jen neco jako
procedure neco;
begin
nalezenoreseni := hledamreseni;
if not nalezenoreseni then neco;
end;
tak jak prestanes jednou volat neco a skoncis proceduru
tak procedura ktera ji volala muze uz taky skoncit a takhle se to zretezi az uplne vsechny skonci
nějak jsem nepochopil, o co jde. proč nemůžeš udělat globální proměnnou?
Jestl i nechceš použít globální proměnnou, tak rekurzi nedefinuj jako proceduru, ale jako funkci. Pokud vrátí hodnutu FALSE, či nějakou jinou definovanou ukončovací hodnotu, tak to bude znamenat, že se má rekurze ukončit. Globální proměnné by se měly používat co nejméně a pokud to bez nich nejde, je nejrozumnější rekurzní proceduru/funkci i tuto proměnnou zabalit do společného objektu.
Typické použití rekurze by mělo vypadat nějak takhle:
Function SoucetCisel(i:integer):longint;
begin
if i=0 then SoucetCisel:=0
else SoucetCisel:=i+SoucetCisel(i-1);
end;
var n:byte;
begin
write('Zadej kladne prirozene cislo: ');
readln(n);
writeln('Soucet cisel 1 az ',n,' je: ',SoucetCisel(n));
readln;
end.
Kromě návratové hodnoty funkce je k řízení průběhu rekurze samozřejmě možné používat i odkazem předávané parametry - tedy parametry s var
Ještě dodatek - pascal umožňuje volání funkcí i jako kdyby to byly procedury.
Takže máme-li funkci:
Function NapisCislo(s:string):boolean;
var i,j:integer;
Val(s,i,j);
if j<>0 then begin Writeln('Nejde o cislo!');NapisCislo:=false;end
else begin Writeln(i);NapisCislo:=true;end;
end;
Tak takovou funkci můžeme volat nejen b:=NapisCislo('chyba'), ale rovněž NapisCislo('chyba')
Takž vlastně klíčové slovo Procedure není vůbc potřeba :smile5:
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Funkce s lokální a globální proměnnou — založil kocourOggy
Rekurze vs zasobnik — založil fitness
Moderátoři diskuze