Autor | Zpráva | ||
---|---|---|---|
FantomX1 Profil |
#1 · Zasláno: 9. 6. 2005, 08:44:08
<?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 * |
#2 · Zasláno: 9. 6. 2005, 08:59:49
K čemu má ta funkce rat() sloužit?
|
||
Kajman Profil * |
#3 · Zasláno: 9. 6. 2005, 09:18:36
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 * |
#4 · Zasláno: 9. 6. 2005, 09:26:35
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 * |
#5 · Zasláno: 9. 6. 2005, 10:12:11
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 * |
#6 · Zasláno: 9. 6. 2005, 10:13:18
je, pardon, zapomnel jsem ten radek s gloabal :)
function rat() { global $auticko; $auticko++; echo "$auticko "; if ($auticko<10) rat(); else return $auticko; } |
||
FantomX1 Profil |
#7 · Zasláno: 9. 6. 2005, 12:54:55 · Upravil/a: FantomX1
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 |
#8 · Zasláno: 9. 6. 2005, 12:58:15
je nezbytné to řešit rekurzí?
|
||
Wan-To Profil * |
#9 · Zasláno: 9. 6. 2005, 12:59:44
<?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 |
#10 · Zasláno: 9. 6. 2005, 13:09:57
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 * |
#11 · Zasláno: 9. 6. 2005, 13:13:07
FantomX1
Tak když budeš proměnnou $pocet potřebovat někde ve skriptu, tak si tu globální nazvi třeba $abcd ;-) |
||
FantomX1 Profil |
#12 · Zasláno: 9. 6. 2005, 13:17:16
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 * |
#13 · Zasláno: 9. 6. 2005, 13:32:31
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 |
#14 · Zasláno: 9. 6. 2005, 13:38:24
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 |
#15 · Zasláno: 9. 6. 2005, 14:01:24
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 |
#16 · Zasláno: 9. 6. 2005, 14:01:29
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 * |
#17 · Zasláno: 9. 6. 2005, 14:06:35
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 |
#18 · Zasláno: 9. 6. 2005, 14:54:13
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 * |
#19 · Zasláno: 9. 6. 2005, 15:54:03
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. |
||
Časová prodleva: 19 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0