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 ֆունկցիայի պարամետրերի փոփոխությունները։