PHP Դասեր - Դաս 9 - Ռեկուրսիա
Նախորդ դասում մենք ուսումնասիրեցինք PHP-ում ֆունկցիաների օգտագործումը։ Այժմ ավելի կխորանանք դրանց կիրառման մեջ։ Մինչ այս մենք դիտարկում էինք հետևյալ տեսակի ֆունկցիաներ՝
<?php
function myFunction(){ // ֆունկցիայի սահմանում
}
$x = myFunction(); // ֆունկցիայի կանչ
?>
Ի՞նչ կլինի, եթե ֆունկցիան կանչենք հենց իր մարմնի ներսում։
<?php
function myFunction(){
$x = myFunction()
...
return $x;
}
$y = myFunction();
Ֆունկցիայի այսպիսի կանչը իր ներսում կոչվում է ռեկուրսիա։ Թեև տեսականորեն բարդ է թվում, գործնականում ամեն ինչ շատ պարզ է։
Եկեք ստեղծենք ֆունկցիա, որը կհաշվի թվի աստիճանը։ Ալգեբրայի դասընթացից դուք հիշում եք, որ n-րդ աստիճանը նշանակում է այդ թիվը n անգամ ինքն իրենով բազմապատկված։ PHP-ում դա այսպես կլինի՝
<?php
function myDegree($x, $n){
if($n == 0){
return 1;
}
if($n < 0){
return myDegree( 1/$x, -$n); // -$n նշանակում է նշանի փոփոխություն
}
return $x * myDegree($x, $n-1); // ֆունկցիայի կանչ իր ներսում
}
$y = myDegree(2, -4); // ֆունկցիայի նախնական կանչ
print $y;
?>
Եկեք հիմա վերլուծենք այս ֆունկցիան։ return-ից հետո ֆունկցիան դադարում է գործել և վերադարձնում է նշված արժեքը։
Առաջին if-ը՝ if($n == 0) նշանակում է՝ եթե աստիճանը 0 է, վերադարձնել 1։ Այստեղ պարզ է՝ յուրաքանչյուր թիվ բարձրացված զրո աստիճան՝ հավասար է 1։ Հաջորդը՝ if($n < 0) նշանակում է՝ եթե աստիճանը բացասական է, ապա փոխում ենք այն դրականի՝ միևնույն ժամանակ շրջելով թիվը՝ դարձնելով հակադարձ։ Դա էլ է ըստ աստիճանի սահմանման։
Իսկ եթե աստիճանը դրական է և ոչ 0, ապա կանչում ենք մեր ֆունկցիան՝ աստիճանը ամեն անգամ նվազեցնելով 1-ով և արդյունքը բազմապատկում հիմնական թվի վրա։
Դիտարկենք ֆունկցիայի յուրաքանչյուր փուլ՝
1. Աստիճան -4, թիվ 2։ Կաշխատի երկրորդ if-ը։ Թիվը կդառնա 0.5, աստիճանը՝ 4։
2. Աստիճան 4, թիվ 0.5։ Կանցնի return $x * myDegree($x, $n-1)
3. Աստիճան 3, թիվ 0.25։
4. Աստիճան 2, թիվ 0.125։
5. Աստիճան 1, թիվ 0.0625։
Վերջին անգամ կաշխատի if($n == 0), կվերադարձնի 1, որը կբազմապատկվի նախորդ արդյունքներով։ Ռեկուրսիան կավարտվի։
Մեկ այլ նմանատիպ օրինակ՝ թվի ֆակտորիալ։ Թվի ֆակտորիալը բոլոր թվերի արտադրյալն է մինչև այդ թիվը։ Օրինակ՝ 6! = 6×5×4×3×2×1 = 720։ Ինչպես երևում է՝ այստեղ ևս օգտագործվում է ռեկուրսիա։
<?php
function myRecursion($x){
if($x == 1){
return $x;
}
return $x*myRecursion($x-1);
}
$y = myRecursion(8);
print $y;
?>
Այս օրինակը ավելի պարզ է, քան նախորդը։ Կարծում եմ դուք ինքնուրույն կկարողանաք վերլուծել myRecursion ֆունկցիայի պարամետրերի փոփոխությունները։