Rekurze s globální proměnnou – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rekurze s globální proměnnou – Pascal – Fórum – Programujte.comRekurze s globální proměnnou – Pascal – Fórum – Programujte.com

 

Dirk
~ Anonymní uživatel
2 příspěvky
15. 11. 2008   #1
-
0
-

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?

Nahlásit jako SPAM
IP: 83.208.235.–
KIIV
~ Moderátor
+43
God of flame
15. 11. 2008   #2
-
0
-

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 ...;

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Dirk
~ Anonymní uživatel
2 příspěvky
15. 11. 2008   #3
-
0
-

Nejde, protože pokaždé zavolám rekurzi 4 krát za sebou a procedura nemá návratovou hodnotu, takže bych nemohl dát vědět původní proceduře že už je nemá dále volat.

Nahlásit jako SPAM
IP: 83.208.235.–
KIIV
~ Moderátor
+43
God of flame
15. 11. 2008   #4
-
0
-

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


Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
15. 11. 2008   #5
-
0
-

nějak jsem nepochopil, o co jde. proč nemůžeš udělat globální proměnnou?

Nahlásit jako SPAM
IP: 78.128.166.–
Laaca0
Stálý člen
16. 11. 2008   #6
-
0
-

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

Nahlásit jako SPAM
IP: 81.0.253.–
DOS-u-akbar
Laaca0
Stálý člen
16. 11. 2008   #7
-
0
-

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:

Nahlásit jako SPAM
IP: 81.0.253.–
DOS-u-akbar
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

Rekurze — založil johny

Rekurze — založil CML

Rekurze — založil NevimCoSemVyplnit

Rekurze vs zasobnik — založil fitness

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý