21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
FantomX1
Profil
<?php


function rat($pocet)
{
$pocet +=1;
echo "$pocet ";
if ($pocet<10)
rat($pocet);
else
return $pocet;
}


$data=rat(0);
echo "$data";

?>

Namiesto 10 co by malo priradit premennej $data nevypise vobec nic. Zrejme preto, pretoze sa premenne $data nic nepriradi, ale nechapem preco.

A este jedna vec, treba vzdy vo funkcii predavat premennu ak sa jedna o rekurzivnu funkciu, alebo staci nejak deklarovat premennu ako global a alebo static? Vedeli by ste mi pomoct? Dakujem.
Wan-To
Profil *
K čemu má ta funkce rat() sloužit?
Kajman
Profil *
Asi se to zacykli, ne?

možná místo
rat($pocet);

použít
$pocet=rat($pocet);

A jen upozorňuji, že tahle funkce nemění parametr, který jí dáte. To return je vrácení hodnoty celé funkce.
Wan-To
Profil *
Proměnná $pocet bude muset být ve funkci globální, ne jako parametr. $pocet jako parametr se totiž změní jen ve funkci, ale pokud bude globální tak v celém skriptu.
peta
Profil *
return $pocet; to je spatne, ok je to return($pocet);

$pocet +=1; je lepsi psat $pocet++

if ($pocet<10)
rat($pocet); ... toto nechapu vubec, volas sam sebe , ale naprosto to postrada logiku, protoze hodnotu, kterou to vrati, uz nikde nezpracovavas. A cele se to zacykly.
Asi to treba resit pres gloabalni promennou, ne?

$auticko=0

function rat()
{
$auticko++;
echo "$auticko ";
if ($auticko<10)
rat();
else
return $auticko;
}

ale vysledkem stejne bude 10, tak moc nechapu, proc to pocitat po jedne
peta
Profil *
je, pardon, zapomnel jsem ten radek s gloabal :)
function rat()
{
global $auticko;
$auticko++;
echo "$auticko ";
if ($auticko<10)
rat();
else
return $auticko;
}
FantomX1
Profil
To Wan-To:
Ta funkcia je len skusobna. Je to test rekurzivnej funkcie, ktora si ma predavat hodnotu urcitej premennej a nasledne ju zvysovat az dovtedy, kym premenna nedosiahne hodnotu 10. Ked dosiahne hodnotu 10, ma ju vratit spat.
Islo mi v tej funkcii hlavne o predavanie premennej.
Robil som to na zaklade tutorialu Diskusní fórum v PHP pro každého - výpis témat, kde sa pri pocitani vsetkych moznych odpovedi na dany prispevok zapisuje pocet doposial najdenych odpovedi do suboru temp pri kazdom volani funkcie a taktiez sa aj cita aby to zistilo predoslu hodnotu. Ja som ale rozmyslal, ci by sa to nedalo predavat ako premenna vo funkcii. Zdalo sa mi zbytocne pouzivat k tomu subor nieco ako premennu typu global.

########################################################
//fce pro pocitani odpovedi
function Answers($topic)
{
if (File_Exists("data/$topic.topic")):
$dat_file = File("data/$topic.topic");
for ($i=Count($dat_file)-1;$i>=0;$i--):
$entry = Explode("#", $dat_file[$i]);

if (File_Exists ("temp.temp")):
$fp = FOpen ("temp.temp", "r");
$data = FRead ($fp, FileSize("temp.temp"));
FClose($fp);
endif;
$fp = FOpen ("temp.temp", "w");
FWrite ($fp, $data+1);
FClose ($fp);

Answers($entry[0]);
endfor;
endif;
}
########################################################


a ta moja funcia

<?php


function rat($pocet)
{
$pocet +=1;
echo "$pocet ";
if ($pocet<10)
rat($pocet);
else
return $pocet;
}


$data=rat(0);
echo "$data";

?>

je len pokusom o predavanie si hodnoty premennej vo funkcii bez toho aby som na to potreboval nejaky odkladaci priestor. Funkcia spravi to co ma, hodnota lokalnej premennej $pocet sa zvacsuje az kym dosiahne 10, co sa aj vypise na obrazovku *1 2 3 4 5 6 7 8 9 10*. Ked dosiahne hodnotu 10 ma ju nasledne vratit a priradit premennej $data, co ale neurobi. Premenna $data ostane prazdna. Keby to vratilo aspon 1cku to by som este pochopil, pretoze by to zrejme priradilo hodnotu funkcie len po prvom vykonani.

To Kajman:
Skusil som aj to s tym tvojim $pocet=rat($pocet); ale vysledok bol uplne taky isty, a nie nezacykli sa to.
A to s tym vracanim hodnoty nechapem, ved cela hodnota funkcie je po vykonani 10, nie? Alebo to vracia aj nejaku inu hodnotu?
A teraz som nieco skusil dal som namiesto $data=rat(0);
toto
$data=(integer)rat(0); a to mi vratilo 0, teda ako by funkcia zlyhala, alebo fakt nevracala nic, ale stale neviem preco.

To Peta:
Skusil som aj to return($pocet); ale nic, uz vies preco tomu chyba logika, je to skusobna funkcia. A nezacykli sa to, funkcia sa vykona 10x a potom skonci. To nie je zacyklenie. Skusim to este s tou $global, aj ked stale nechapem preco to nejde aj takto a chcem sa aj nieco opytat ak dam premennu pocet ako globalnu to znamena ze ak mam este niekde v skripte pouzitu premennu $pocet tak mi ju zmeni? Napriklad keby som mal este predtym definovanu premennu $pocet="šest" tak potom sa bude rovnat 10? To ja nechcem, chcem aby ta funkcia proste vracala hodnotu a nie menila mi premenne ktore uz mam definovane? Alebo ju to nezmeni? Dakujem.
printf
Profil
je nezbytné to řešit rekurzí?
Wan-To
Profil *
<?php


function rat()
{
global $pocet;
$pocet++;
echo "$pocet ";
if ($pocet<10)
rat();
else
return $pocet;
}

$pocet = 0;
$data=rat();
echo "$data";

?>

Tohle funguje.
FantomX1
Profil
To Printf:

A poznas aj iny sposob?

To Wan-to:

Skusim to, ale ja by som chcel aby ta funkcia nemenila hodnotu ziadnej inej globalnej premennej, pretoze mozno by som mohol potrebovat globalnu premennu pocet na nieco ine. A takto mi to zmeni hodnotu premennej $pocet v celom skripte, proste aby premenna $pocet vo vnutri funkcii a premenna $pocet v skripte boli dve uplne odlisne veci. Dakujem.
Wan-To
Profil *
FantomX1
Tak když budeš proměnnou $pocet potřebovat někde ve skriptu, tak si tu globální nazvi třeba $abcd ;-)
FantomX1
Profil
To Wan-To:
:) Dik, ale teraz k inej veci.

Ten tvoj skript mi nejde. Kusok som ho pozmenil a stale nejde, skusil si ho aj na kompe?
Tu je v pozmenenej forme

<?php


function rat()
{
global $pocet;
$pocet++;
echo "$pocet ";
if ($pocet<10)
rat();
else
return($pocet);
}

$pocet = 0;
$data=rat();
$typ=gettype($data);
echo $data." ".$typ;



?>

Dal som si aj zistovat akeho typu je vratena premenna $data a zistil som ze ziadneho, pretoze nema ziadnu hodnotu. Len si to skuste bud doma na PC na vlastnom serveri alebo niekde na hostingu a zistite ze sa aj tak nic nepriradi. Co mam s tym spravit?
Wan-To
Profil *
FantomX1
A proč když víš, že se proměnná $pocet bude zvyšovat až do 9, proč jí na těch 9 rovnou nenastavíš?
FantomX1
Profil
Ako som uz napisal tu nejde o nastavovanie hodnoty premennej ale o predavani si hodnoty premennej v rekurzivnej funkcii dalsim instanciam funkcie. Je to len cvicna funkcia.
FantomX1
Profil
Tak, po dlhsom hrani som na to prisiel, treba pouzit klucove slovo Static

a chyba je tu

if ($pocet<10)
rat();
else
return $pocet;

ma to byt totiz bez toho ELSE, neviem preco, ale s tym else to nejde.

Spravne je to takto

function rat()
{
static $pocet=0;
$pocet++;
echo "$pocet ";
if ($pocet<10)
rat();
return $pocet;
}

Vlastne nie je to chyba ani tak v else ako v tom ze return nesmie byt v podmienke, pretoze to nie je funkcia, ale konstrukcia tak ako napriklad ECHO a preto aj jej vypisovanie nema byt RETURN(), ale RETURN premenna, RETURN() je len alternativa ako pri Echo(); ale myli to cloveka a potom si mysli ze je to funkcia.

Takze nejde ani toto
function rat()
{
static $pocet=0;
$pocet++;
echo "$pocet ";
if ($pocet>=10)
return $pocet;
rat();
}
printf
Profil
jestli jde jen o procvičení práce s rekurzivní funkcí, tak to chápu.
function rat()
{
global $pocet;
while ($pocet<10)
{
$pocet++;
echo "$pocet ";
}
return($pocet);
}

$pocet = 0;
$data=rat();
$typ=gettype($data);
echo $data." ".$typ;
peta
Profil *
Wan-To: To mas neco, jak sem psal ja, akorad tam nemusis mit to return, protoze prepisujes globalni promennou.

FantomX1: Dobre, a jak si ten rekurzivni zpusob predstavuje?
Tvuj priklad dela to, ze (vemu tu uplne prvni verzi)

function rat($pocet)
{
//zvyseni vnitrni promenne o 1
$pocet +=1;
//vypis vnitrni promennou
echo "$pocet ";
// jestlize je <10 spusti rat s novou hodnotou promenne pocet nebo ji vrat (kdyby to bylo ok)
if ($pocet<10)
rat($pocet);
else
// tento radek se ignoruje, protoze je chybny
return $pocet;
}


//do $data dej vysledek, ktery vrati rat()
$data=rat(0);
// vypis hodnotu v $data
echo "$data";


Jenze, milej zlatej, tady je chyba v logice programovani...

$data=rat(0); .. oznacme [0]
function rat($pocet) .. oznacme [1]
$pocet +=1; .. oznacme [2]
if ($pocet<10)
rat($pocet); .. oznacme [3]

takze prvni krok
0,1: spousti se rat, ktere priradi pocet[a] hodnotu 0
2: zvysi hodnotu pocet[a]
3: zavola funkci, ktere preda hodnotu, funkce si vytvori pocet[b]=pocet[a], zvysi pocet[b] a kdyby byl 10, tak jej vrati.
Jenze nema cemu, protoze ty jsi ji v predchozim kroku neprebiras ($pocet=rat($pocet))
A i kdyby jsi to takhle mel, pak tam mas jeste to else, ktere ti to do -1 kroku nevrati, ikdyz je nyni v pocet[n-1]=rat($pocet).
Cili ten script by mel vypadat asi nejak takhle, bez toho else a s predanim hodnoty tomuto cyklu z toho noveho...
Cili vzdy tva funkce vrati hodnotu, ikdyz nebude >9 , jinak se ti hodnota ztraci v nenavratnu, totiz (v tvem scriptu).

function rat($auticko)
{
$auticko++;
echo "$auticko ";
if ($auticko<10) $auticko=rat($auticko);
return $auticko;
}
FantomX1
Profil
To Peta:
Tvoje riesenie je spravne aj ked tvojmu vykladu som celkom neporozumel, asi si to budem musiet precitat viackrat, no s tou podmienkou je to dobre, jedina vec co som tam v konecnom dosledku nemal bolo toto
$auticko=rat($auticko);
priradenie premennej $auticko vykonavanie funkcie, myslim ze chyba bude v tom ze som si pracu rekurzivnej funkcie zle vysvetloval
ja som to bral tak ze pociatocna funkcia ktoru volas zanikne a jej hodnota sa preda dalsej a ze potom sa priradi az hodnota tej poslednej funkcii do premennej $data.
Ale podla tvojho prikladu som pochopil ze je to takto
zavolam funkciu a ta dalsie ktore najprv od prvej do desiatej pricitaju vzdy jedna a pritom volaju dalsiu a az potom ta 10 zacne vracat tej deviatej az ta druha vrati vysledok prvej a ta prva to priradi premennej $data.

Este raz dik za vysvetlenie, velmi si mi pomohol.
peta
Profil *
FantomX1

No jo, ja moc neumim vysvetlovat, kdyz se mi nechce.
Zkratka nej reseni je pres tu globalni promennou. Nemusi tam mit to else a nemusis tam pro kazde volani psat nazev $pocet

Zkusim to vysvetlit jinak...
Pokazde, kdyz zavalos funkci, ktera ma definovani promenne ... xxx($aaa), pak se ta $aaa vytvori vzdy jako nova, fiktivni. Pokud ji chces pouzit mimo tu funkci, pak leda vratit return() nebo pres globalni.
Co se tyce returnu, tak, jak jsi to napsal se to dela v javascriptu a v mnoha dalsich jazycich.
Zkratka php je uplne jiny jazyk, ja to taky zjistuji, stale parse error. Pocitam, ze takhle, jak je, zanikne a moc se pouzivat nebude. Jeste horsi je ASP c#, tam je strednik skutecne za kazdym nesmyslem :) Proti pohodli v JS je PHP a spol na nic.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0