The PHP WTF
Školení, která pořádám
Článek byl psán jako Aprílové povyražení a není tedy myšlen vážně.
Na webu najdete spoustu návodů a rad k programování (mnohde včetně použitelných ukázek), ať už obecných nebo těch zaměřených přímo na PHP. Jeden z nejlepších serverů tohoto druhu, se kterými jsem se setkal, je The PHP WTF. Kromě ukázek kódu, které jsou ihned použitelné v praxi, poskytuje i kvalitní výklad problematiky. Podívejte se třeba na to, jak lze otestovat lichost nebo sudost čísla:
<?php
// test lichého čísla
if ($x/2 != floor($x/2)) {
// liché číslo
}
// test sudého čísla
function IsEven($num) {
if ($num < 0)
return IsEven(-$num);
if ($num > 1)
return IsEven($num-2);
if ($num == 1)
return 0;
else return 1;
}
?>
Obzvlášť druhý příklad se mi jeví velice elegantní a efektivní a ve své aplikaci bych neváhal ho použít bez jakýchkoliv úprav tak, jak je.
Diskuse
Druhý příklad je obzvláště zdařilý. Myslím, že by se mohl na přednáškách uvádět jako klasický příklad na rekurzi. Píšu si to do poznámek.
Pavel Zbytovský:
Taky klasický přílad se mi zdá vypisování strukturovaných reakcí v diskusi nebo u komentářů. Funkce se volá se svým id a tím se použije pro všechny děti.
Díky za námět, už to mám delší dobu mezi tématy článků.
Bohumír Bednařík (BoboCop):
Je to opravdu pěkný příklad rekurze. Musel jsem nad tím sice chviličku přemýšlet, než jsem to pochopil, ale po pak jsem si uvědomil, že je to vlastně velice jednoduché a přitom funkční. Nicméně si nejsem úplně jist tím, jestli by nebylo rychlejší číslo podělit dvěma a zjišťovat zbytek po dělení. Přeci jen u větších čísel by tato funkce mohla být relativně pomalá (alespoň si to myslím - příliš mnoho operací, které by mohly být nahrazeny dvěma - dělení a zjištění zbytku po dělení).
Joe:
Ja myslim, ze lepsi nez rekurzivni reseni je urcite obycejna smycka. imho ale zalezi, do jake miry ma interpret php optimalizovany takove postupy.
<?php
function IsEven($num)
{
$num = ($num<0)?-$num:$num;
$even = true; while($num-->0) $even = !$even;
return $even;
}
?>
puco:
Ta rekurzia je mozno pekny priklad ale urcite by som to nepuzival. Preco nepouzit function IsEven($num)
{ return ($num % 2)?0:1; }. Ta rekurzia mi pripomina prolog.
puco:
ze ja sa nepozrem do kalendara aky je datum a potom to tak vypada
Jakub Podhorský:
imho by to mělo vracet true a false a ne 1 a 0 :)
asi tak, nechapu proc delat veci slozite kdyz to jde na jeden radek :)
//pomineme ze se to hodi tak na prednasku
Jakub Podhorský:
mimochodem ještě k The PHP WTF.....ten článek není o tom jak efektivně zjistit lichost nebo sudost čísla ale poukazuje přesně na to jak se to dělat nemá...proč používat zbytečně složitou a pomalou rekurzi když to všechno zvádnu pomocí operátorů
jak zde už zaznělo je to krásný příklad toho jak se používá rekurze ale používat to v provozu? děkuji ne zbytečně to prodlužuje kód
Jakub Vrána :
Lidi, vždyť to byl Apríl. Takhle pitomý způsob zjišťování lichého čísla samozřejmě nemůže nikdo myslet vážně a rozhodně se nehodí ani na přednášku.
Joe:
v zadnem pripade se neda souhlasit s tim, ze je to "krasny priklad rekurze". jestlize mi funkce ve svem tele zmeni svuj obsah a zavola se znovu jen aby se podminka volani preskocila, po navratu z5 se vykonal znovu zbytecne kod neni rekurze, ale cista pomsta svemu hostingu :)
Tomáš:
Mě se jako nejrychlejší způsob jeví:
<?php
function isEven($num) { return ($num & 1)==0; }
?>
pif:
taky díky za tu inspirativní sajtu s code snippets (PHP WTF), je tam spousta nápadů, který se budou hodit! super
jenom nevím proč se menuje tak difně
pif:
kdo to tady pise za me?
Jakub Vrána :
Můžu ti říct jenom tolik, že to byl někdo z adresy ch-81-1.coolhousing.cz. Mohl to ale být nějaký tvůj jmenovec.
sh:
jen takovy dotaz neslo by na zjisteni sudeho cisla pouzit taky ten prvni priklad akorat misto != by tam mohlo byt ==
<?php
if ($x/2 == floor($x/2)) {
// sudé číslo
}
?>
v6ak:
Určitě, ale toto je kód spíš pro pobavení. Samozřejmě, nejlepším způsobem bude asi modulo dělení: $x%2 == 0 pro sudé a analogicky pro liché.
BTW: Škoda, že ten server tu už není :(
Diskuse je zrušena z důvodu spamu.