ÐеÑнÑмÑÑ Ðº ÑÑнкÑиÑм и изÑÑим Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ подÑобно.
ÐаÑей пеÑвой Ñемой бÑÐ´ÐµÑ ÑекÑÑÑиÑ.
ÐÑли Ð²Ñ Ð½Ðµ новиÑок в пÑогÑаммиÑовании, Ñо, возможно, Ñже Ð·Ð½Ð°ÐºÐ¾Ð¼Ñ Ñ ÑекÑÑÑией и можеÑе пÑопÑÑÑиÑÑ ÑÑÑ Ð³Ð»Ð°Ð²Ñ.
РекÑÑÑÐ¸Ñ â ÑÑо пÑиÑм пÑогÑаммиÑованиÑ, полезнÑй в ÑиÑÑаÑиÑÑ , когда задаÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÐµÑÑеÑÑвенно Ñазделена на неÑколÑко аналогиÑнÑÑ , но более пÑоÑÑÑÑ Ð·Ð°Ð´Ð°Ñ. Ðли когда задаÑа Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑпÑоÑена до неÑложнÑÑ Ð´ÐµÐ¹ÑÑвий плÑÑ Ð¿ÑоÑÑой ваÑÐ¸Ð°Ð½Ñ Ñой же задаÑи. Ðли, как Ð¼Ñ ÑкоÑо Ñвидим, Ð´Ð»Ñ ÑабоÑÑ Ñ Ð¾Ð¿ÑеделÑннÑми ÑÑÑÑкÑÑÑами даннÑÑ .
РпÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñи в Ñеле ÑÑнкÑии могÑÑ Ð±ÑÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ Ð´ÑÑгие ÑÑнкÑии Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð·Ð°Ð´Ð°Ñ. ЧаÑÑнÑй ÑлÑÑай подвÑзова â когда ÑÑнкÑÐ¸Ñ Ð²ÑзÑÐ²Ð°ÐµÑ Ñама ÑебÑ. ÐÑо как Ñаз и назÑваеÑÑÑ ÑекÑÑÑией.
Ðва ÑпоÑоба мÑÑлениÑ
РкаÑеÑÑве пеÑвого пÑимеÑа напиÑем ÑÑнкÑÐ¸Ñ pow(x, n), коÑоÑÐ°Ñ Ð²Ð¾Ð·Ð²Ð¾Ð´Ð¸Ñ x в наÑÑÑалÑнÑÑ ÑÑÐµÐ¿ÐµÐ½Ñ n. ÐнаÑе говоÑÑ, ÑÐ¼Ð½Ð¾Ð¶Ð°ÐµÑ x на Ñамо ÑÐµÐ±Ñ n Ñаз.
pow(2, 2) = 4
pow(2, 3) = 8
pow(2, 4) = 16
РаÑÑмоÑÑим два ÑпоÑоба ÐµÑ ÑеализаÑии.
-
ÐÑеÑаÑивнÑй ÑпоÑоб: Ñикл
for:function pow(x, n) { let result = 1; // Ñмножаем result на x n Ñаз в Ñикле for (let i = 0; i < n; i++) { result *= x; } return result; } alert( pow(2, 3) ); // 8 -
РекÑÑÑивнÑй ÑпоÑоб: ÑпÑоÑение задаÑи и вÑзов ÑÑнкÑией Ñамой ÑебÑ:
function pow(x, n) { if (n == 1) { return x; } else { return x * pow(x, n - 1); } } alert( pow(2, 3) ); // 8
ÐбÑаÑиÑе внимание, ÑÑо ÑекÑÑÑивнÑй ваÑÐ¸Ð°Ð½Ñ Ð¾ÑлиÑаеÑÑÑ Ð¿ÑинÑипиалÑно.
Ðогда ÑÑнкÑÐ¸Ñ pow(x, n) вÑзÑваеÑÑÑ, иÑполнение делиÑÑÑ Ð½Ð° две веÑви:
if n==1 = x
/
pow(x, n) =
\
else = x * pow(x, n - 1)
- ÐÑли
n == 1, Ñогда вÑÑ Ð¿ÑоÑÑо. ÐÑа веÑÐ²Ñ Ð½Ð°Ð·ÑваеÑÑÑ Ð±Ð°Ð·Ð¾Ð¹ ÑекÑÑÑии, поÑÐ¾Ð¼Ñ ÑÑо ÑÑÐ°Ð·Ñ Ð¶Ðµ пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº оÑÐµÐ²Ð¸Ð´Ð½Ð¾Ð¼Ñ ÑезÑлÑÑаÑÑ:pow(x, 1)Ñавноx. - ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ пÑедÑÑавиÑÑ
pow(x, n)в виде:x * pow(x, n - 1). ЧÑо в маÑемаÑике запиÑÑваеÑÑÑ ÐºÐ°Ðº:xn = x * xn-1. ÐÑа веÑÐ²Ñ â Ñаг ÑекÑÑÑии: Ð¼Ñ Ñводим задаÑÑ Ðº более пÑоÑÑÐ¾Ð¼Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ (Ñмножение наx) и более пÑоÑÑой аналогиÑной задаÑе (powÑ Ð¼ÐµÐ½ÑÑимn). ÐоÑледÑÑÑие Ñаги ÑпÑоÑаÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð²ÑÑ Ð±Ð¾Ð»ÑÑе и болÑÑе, покаnне доÑÑигаеÑ1.
ÐовоÑÑÑ, ÑÑо ÑÑнкÑÐ¸Ñ pow ÑекÑÑÑивно вÑзÑÐ²Ð°ÐµÑ ÑÐ°Ð¼Ñ ÑÐµÐ±Ñ Ð´Ð¾ n == 1.
ÐапÑимеÑ, ÑекÑÑÑивнÑй ваÑÐ¸Ð°Ð½Ñ Ð²ÑÑиÑÐ»ÐµÐ½Ð¸Ñ pow(2, 4) ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· Ñагов:
pow(2, 4) = 2 * pow(2, 3)pow(2, 3) = 2 * pow(2, 2)pow(2, 2) = 2 * pow(2, 1)pow(2, 1) = 2
ÐÑак, ÑекÑÑÑÐ¸Ñ Ð¸ÑполÑзÑÑÑ, когда вÑÑиÑление ÑÑнкÑии можно ÑвеÑÑи к ÐµÑ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑÐ¾Ð¼Ñ Ð²ÑзовÑ, а его â к еÑÑ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑÐ¾Ð¼Ñ Ð¸ Ñак далее, пока знаÑение не ÑÑÐ°Ð½ÐµÑ Ð¾Ñевидно.
РекÑÑÑивное ÑеÑение задаÑи обÑÑно коÑоÑе, Ñем иÑеÑаÑивное.
ÐÑполÑзÑÑ ÑÑловнÑй опеÑаÑÐ¾Ñ ? вмеÑÑо if, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пеÑепиÑаÑÑ pow(x, n), Ð´ÐµÐ»Ð°Ñ ÐºÐ¾Ð´ ÑÑнкÑии более лакониÑнÑм, но вÑÑ ÐµÑÑ Ð»ÐµÐ³ÐºÐ¾ ÑиÑаемÑм:
function pow(x, n) {
return (n == 1) ? x : (x * pow(x, n - 1));
}
ÐбÑее колиÑеÑÑво вложеннÑÑ
вÑзовов (вклÑÑÐ°Ñ Ð¿ÐµÑвÑй) назÑваÑÑ Ð³Ð»Ñбиной ÑекÑÑÑии. РнаÑем ÑлÑÑае она бÑÐ´ÐµÑ Ñавна n.
ÐакÑималÑÐ½Ð°Ñ Ð³Ð»Ñбина ÑекÑÑÑии огÑаниÑена движком JavaScript. ТоÑно можно ÑаÑÑÑиÑÑваÑÑ Ð½Ð° 10000 вложеннÑÑ Ð²Ñзовов, некоÑоÑÑе инÑеÑпÑеÑаÑоÑÑ Ð´Ð¾Ð¿ÑÑкаÑÑ Ð¸ болÑÑе, но Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва из Ð½Ð¸Ñ 100000 вÑзовов â за пÑеделами возможноÑÑей. СÑÑеÑÑвÑÑÑ Ð°Ð²ÑомаÑиÑеÑкие опÑимизаÑии, помогаÑÑие избежаÑÑ Ð¿ÐµÑÐµÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑека вÑзовов («опÑимизаÑÐ¸Ñ Ñ Ð²Ð¾ÑÑовой ÑекÑÑÑии»), но они еÑÑ Ð½Ðµ поддеÑживаÑÑÑÑ Ð²ÐµÐ·Ð´Ðµ и ÑабоÑаÑÑ ÑолÑко Ð´Ð»Ñ Ð¿ÑоÑÑÑÑ ÑлÑÑаев.
ÐÑо огÑаниÑÐ¸Ð²Ð°ÐµÑ Ð¿Ñименение ÑекÑÑÑии, но она вÑÑ Ñавно ÑиÑоко ÑаÑпÑоÑÑÑанена: Ð´Ð»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑÑого ÑиÑла Ð·Ð°Ð´Ð°Ñ ÑекÑÑÑивнÑй ÑпоÑоб ÑеÑÐµÐ½Ð¸Ñ Ð´Ð°ÑÑ Ð±Ð¾Ð»ÐµÐµ пÑоÑÑой код, коÑоÑÑй легÑе поддеÑживаÑÑ.
ÐонÑекÑÑ Ð²ÑполнениÑ, ÑÑек
ТепеÑÑ Ð¼Ñ Ð¿Ð¾ÑмоÑÑим, как ÑабоÑаÑÑ ÑекÑÑÑивнÑе вÑзовÑ. ÐÐ»Ñ ÑÑого заглÑнем «под капоÑ» ÑÑнкÑий.
ÐнÑоÑмаÑÐ¸Ñ Ð¾ пÑоÑеÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑÑенной ÑÑнкÑии Ñ ÑаниÑÑÑ Ð² ÐµÑ ÐºÐ¾Ð½ÑекÑÑе вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (execution context).
ÐонÑекÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ â ÑпеÑиалÑÐ½Ð°Ñ Ð²Ð½ÑÑÑеннÑÑ ÑÑÑÑкÑÑÑа даннÑÑ
, коÑоÑÐ°Ñ ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ вÑзове ÑÑнкÑии. Ðна вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ ÐºÐ¾Ð½ÐºÑеÑное меÑÑо в коде, на коÑоÑом наÑ
одиÑÑÑ Ð¸Ð½ÑеÑпÑеÑаÑоÑ, локалÑнÑе пеÑеменнÑе ÑÑнкÑии, знаÑение this (Ð¼Ñ Ð½Ðµ иÑполÑзÑем его в данном пÑимеÑе) и пÑоÑÑÑ ÑлÑжебнÑÑ Ð¸Ð½ÑоÑмаÑиÑ.
Ðдин вÑзов ÑÑнкÑии Ð¸Ð¼ÐµÐµÑ Ñовно один конÑекÑÑ Ð²ÑполнениÑ, ÑвÑзаннÑй Ñ Ð½Ð¸Ð¼.
Ðогда ÑÑнкÑÐ¸Ñ Ð¿ÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñй вÑзов, пÑоиÑÑ Ð¾Ð´Ð¸Ñ ÑледÑÑÑее:
- ÐÑполнение ÑекÑÑей ÑÑнкÑии пÑиоÑÑанавливаеÑÑÑ.
- ÐонÑекÑÑ Ð²ÑполнениÑ, ÑвÑзаннÑй Ñ Ð½ÐµÐ¹, запоминаеÑÑÑ Ð² ÑпеÑиалÑной ÑÑÑÑкÑÑÑе даннÑÑ â ÑÑеке конÑекÑÑов вÑполнениÑ.
- ÐÑполнÑÑÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе вÑзовÑ, Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из коÑоÑÑÑ ÑоздаÑÑÑÑ Ñвой конÑекÑÑ Ð²ÑполнениÑ.
- ÐоÑле Ð¸Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑÑаÑÑй конÑекÑÑ Ð´Ð¾ÑÑаÑÑÑÑ Ð¸Ð· ÑÑека, и вÑполнение внеÑней ÑÑнкÑии возобновлÑеÑÑÑ Ñ Ñого меÑÑа, где она бÑла оÑÑановлена.
РазбеÑÑмÑÑ Ñ ÐºÐ¾Ð½ÑекÑÑами более подÑобно на пÑимеÑе вÑзова ÑÑнкÑии pow(2, 3).
pow(2, 3)
РнаÑале вÑзова pow(2, 3) конÑекÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ñ
ÑаниÑÑ Ð¿ÐµÑеменнÑе: x = 2, n = 3, вÑполнение наÑ
одиÑÑÑ Ð½Ð° пеÑвой ÑÑÑоке ÑÑнкÑии.
Ðожно ÑÑ ÐµÐ¼Ð°ÑиÑеÑки изобÑазиÑÑ ÑÑо Ñак:
- ÐонÑекÑÑ: { x: 2, n: 3, ÑÑÑока 1 } pow(2, 3)
ÐÑо ÑолÑко наÑало вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑии. УÑловие n == 1 ложно, поÑÑÐ¾Ð¼Ñ Ð²Ñполнение идÑÑ Ð²Ð¾ вÑоÑÑÑ Ð²ÐµÑÐºÑ if:
function pow(x, n) {
if (n == 1) {
return x;
} else {
return x * pow(x, n - 1);
}
}
alert( pow(2, 3) );
ÐнаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеменнÑÑ Ñе же ÑамÑе, но вÑполнение ÑÑнкÑии пеÑеÑло к дÑÑгой ÑÑÑоке, акÑÑалÑнÑй конÑекÑÑ:
- ÐонÑекÑÑ: { x: 2, n: 3, ÑÑÑока 5 } pow(2, 3)
ЧÑÐ¾Ð±Ñ Ð²ÑÑиÑлиÑÑ Ð²ÑÑажение x * pow(x, n - 1), ÑÑебÑеÑÑÑ Ð¿ÑоизвеÑÑи запÑÑк pow Ñ Ð½Ð¾Ð²Ñми аÑгÑменÑами pow(2, 2).
pow(2, 2)
ÐÐ»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð³Ð¾ вÑзова JavaScript Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑ ÑекÑÑий конÑекÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² ÑÑеке конÑекÑÑов вÑполнениÑ.
ÐдеÑÑ Ð¼Ñ Ð²ÑзÑваем ÑÑ Ð¶Ðµ ÑÑнкÑÐ¸Ñ pow, однако ÑÑо абÑолÑÑно неважно. ÐÐ»Ñ Ð»ÑбÑÑ
ÑÑнкÑий пÑоÑеÑÑ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²:
- ТекÑÑий конÑекÑÑ Â«Ð·Ð°Ð¿Ð¾Ð¼Ð¸Ð½Ð°ÐµÑÑÑ» на веÑÑине ÑÑека.
- СоздаÑÑÑÑ Ð½Ð¾Ð²Ñй конÑекÑÑ Ð´Ð»Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð³Ð¾ вÑзова.
- Ðогда вÑполнение вложенного вÑзова заканÑиваеÑÑÑ â конÑекÑÑ Ð¿ÑедÑдÑÑего вÑзова воÑÑÑанавливаеÑÑÑ, и вÑполнение ÑооÑвеÑÑÑвÑÑÑей ÑÑнкÑии пÑодолжаеÑÑÑ.
Ðид конÑекÑÑа в наÑале вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð³Ð¾ вÑзова pow(2, 2):
- ÐонÑекÑÑ: { x: 2, n: 2, ÑÑÑока 1 } pow(2, 2)
- ÐонÑекÑÑ: { x: 2, n: 3, ÑÑÑока 5 } pow(2, 3)
ÐовÑй конÑекÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð½Ð° веÑÑине ÑÑека (и вÑделен жиÑнÑм), а пÑедÑдÑÑие запомненнÑе конÑекÑÑÑ â под ним.
Ðогда вÑполнение подвÑзова законÑиÑÑÑ, можно бÑÐ´ÐµÑ Ð»ÐµÐ³ÐºÐ¾ веÑнÑÑÑÑÑ Ð½Ð°Ð·Ð°Ð´, поÑÐ¾Ð¼Ñ ÑÑо конÑекÑÑ ÑÐ¾Ñ ÑанÑÐµÑ ÐºÐ°Ðº пеÑеменнÑе, Ñак и ÑоÑное меÑÑо кода, в коÑоÑом он оÑÑановилÑÑ. Слово «ÑÑÑока» на ÑиÑÑÐ½ÐºÐ°Ñ ÑÑловно, на Ñамом деле запоминаеÑÑÑ Ð±Ð¾Ð»ÐµÐµ ÑоÑное меÑÑо в ÑепоÑке команд.
pow(2, 1)
ÐÑоÑеÑÑ Ð¿Ð¾Ð²ÑоÑÑеÑÑÑ: пÑоизводиÑÑÑ Ð½Ð¾Ð²Ñй вÑзов в ÑÑÑоке 5, ÑепеÑÑ Ñ Ð°ÑгÑменÑами x=2, n=1.
СоздаÑÑÑÑ Ð½Ð¾Ð²Ñй конÑекÑÑ Ð²ÑполнениÑ, пÑедÑдÑÑий конÑекÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑеÑÑÑ Ð² ÑÑек:
- ÐонÑекÑÑ: { x: 2, n: 1, ÑÑÑока 1 } pow(2, 1)
- ÐонÑекÑÑ: { x: 2, n: 2, ÑÑÑока 5 } pow(2, 2)
- ÐонÑекÑÑ: { x: 2, n: 3, ÑÑÑока 5 } pow(2, 3)
ТепеÑÑ Ð² ÑÑеке два ÑÑаÑÑÑ
конÑекÑÑа и один ÑекÑÑий Ð´Ð»Ñ pow(2, 1).
ÐÑÑ Ð¾Ð´
ÐÑи вÑполнении pow(2, 1), в оÑлиÑие Ð¾Ñ Ð¿ÑедÑдÑÑиÑ
запÑÑков, ÑÑловие n == 1 иÑÑинно, поÑÑÐ¾Ð¼Ñ Ð²ÑполнÑеÑÑÑ Ð¿ÐµÑÐ²Ð°Ñ Ð²ÐµÑка ÑÑÐ»Ð¾Ð²Ð¸Ñ if:
function pow(x, n) {
if (n == 1) {
return x;
} else {
return x * pow(x, n - 1);
}
}
ÐложеннÑÑ
вÑзовов болÑÑе неÑ, поÑÑÐ¾Ð¼Ñ ÑÑнкÑÐ¸Ñ Ð·Ð°Ð²ÐµÑÑаеÑÑÑ, возвÑаÑÐ°Ñ 2.
Ðогда ÑÑнкÑÐ¸Ñ Ð·Ð°ÐºÐ°Ð½ÑиваеÑÑÑ, конÑекÑÑ ÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑÑе не нÑжен, поÑÑÐ¾Ð¼Ñ Ð¾Ð½ ÑдалÑеÑÑÑ Ð¸Ð· памÑÑи, а из ÑÑека воÑÑÑанавливаеÑÑÑ Ð¿ÑедÑдÑÑий:
- ÐонÑекÑÑ: { x: 2, n: 2, ÑÑÑока 5 } pow(2, 2)
- ÐонÑекÑÑ: { x: 2, n: 3, ÑÑÑока 5 } pow(2, 3)
ÐозобновлÑеÑÑÑ Ð¾Ð±ÑабоÑка вÑзова pow(2, 2). ÐÐ¼ÐµÑ ÑезÑлÑÑÐ°Ñ pow(2, 1), он Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°ÐºÐ¾Ð½ÑиÑÑ ÑÐ²Ð¾Ñ ÑабоÑÑ x * pow(x, n - 1), веÑнÑв 4.
ÐоÑÑÑанавливаеÑÑÑ ÐºÐ¾Ð½ÑекÑÑ Ð¿ÑедÑдÑÑего вÑзова:
- ÐонÑекÑÑ: { x: 2, n: 3, ÑÑÑока 5 } pow(2, 3)
СамÑй внеÑний вÑзов заканÑÐ¸Ð²Ð°ÐµÑ ÑÐ²Ð¾Ñ ÑабоÑÑ, его ÑезÑлÑÑаÑ: pow(2, 3) = 8.
ÐлÑбина ÑекÑÑÑии в данном ÑлÑÑае ÑоÑÑавила 3.
Ðак видно из иллÑÑÑÑаÑий вÑÑе, глÑбина ÑекÑÑÑии Ñавна макÑималÑÐ½Ð¾Ð¼Ñ ÑиÑÐ»Ñ ÐºÐ¾Ð½ÑекÑÑов, одновÑеменно Ñ ÑанимÑÑ Ð² ÑÑеке.
ÐбÑаÑим внимание на ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº памÑÑи. РекÑÑÑÐ¸Ñ Ð¿ÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð²ÑеÑ
даннÑÑ
Ð´Ð»Ñ Ð½ÐµÐ¾ÐºÐ¾Ð½ÑеннÑÑ
внеÑниÑ
вÑзовов в ÑÑеке, и в данном ÑлÑÑае ÑÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑомÑ, ÑÑо возведение в ÑÑÐµÐ¿ÐµÐ½Ñ n Ñ
ÑÐ°Ð½Ð¸Ñ Ð² памÑÑи n ÑазлиÑнÑÑ
конÑекÑÑов.
РеализаÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð² ÑÑÐµÐ¿ÐµÐ½Ñ ÑеÑез Ñикл гоÑаздо более Ñкономна:
function pow(x, n) {
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
ÐÑеÑаÑивнÑй ваÑÐ¸Ð°Ð½Ñ ÑÑнкÑии pow иÑполÑзÑÐµÑ Ð¾Ð´Ð¸Ð½ конÑекÑÑ, в коÑоÑом бÑдÑÑ Ð¿Ð¾ÑледоваÑелÑно менÑÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ i и result. ÐÑи ÑÑом обÑÑм заÑÑаÑиваемой памÑÑи неболÑÑой, ÑикÑиÑованнÑй и не завиÑÐ¸Ñ Ð¾Ñ n.
ÐÑÐ±Ð°Ñ ÑекÑÑÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑеделана в Ñикл. Ðак пÑавило, ваÑÐ¸Ð°Ð½Ñ Ñ Ñиклом бÑÐ´ÐµÑ ÑÑÑекÑивнее.
Ðо пеÑеделка ÑекÑÑÑии в Ñикл Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÑÑивиалÑной, оÑобенно когда в ÑÑнкÑии в завиÑимоÑÑи Ð¾Ñ ÑÑловий иÑполÑзÑÑÑÑÑ ÑазлиÑнÑе ÑекÑÑÑивнÑе подвÑзовÑ, ÑезÑлÑÑаÑÑ ÐºÐ¾ÑоÑÑÑ Ð¾Ð±ÑединÑÑÑÑÑ, или когда веÑвление более Ñложное. ÐпÑимизаÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ½Ñжной и ÑовеÑÑенно неÑÑоÑÑей ÑÑилий.
ЧаÑÑо код Ñ Ð¸ÑполÑзованием ÑекÑÑÑии более коÑоÑкий, лÑгкий Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¸ поддеÑжки. ÐпÑимизаÑÐ¸Ñ ÑÑебÑеÑÑÑ Ð½Ðµ везде, как пÑавило, нам важен Ñ Ð¾ÑоÑий код, поÑÑÐ¾Ð¼Ñ Ð¾Ð½Ð° и иÑполÑзÑеÑÑÑ.
РекÑÑÑивнÑе Ð¾Ð±Ñ Ð¾Ð´Ñ
ÐÑÑгим оÑлиÑнÑм пÑименением ÑекÑÑÑии ÑвлÑеÑÑÑ ÑекÑÑÑивнÑй Ð¾Ð±Ñ Ð¾Ð´.
ÐÑедÑÑавÑÑе, Ñ Ð½Ð°Ñ ÐµÑÑÑ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ. СÑÑÑкÑÑÑа пеÑÑонала Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑедÑÑавлена как обÑекÑ:
let company = {
sales: [{
name: 'John',
salary: 1000
}, {
name: 'Alice',
salary: 600
}],
development: {
sites: [{
name: 'Peter',
salary: 2000
}, {
name: 'Alex',
salary: 1800
}],
internals: [{
name: 'Jack',
salary: 1300
}]
}
};
ÐÑÑгими Ñловами, в компании еÑÑÑ Ð¾ÑделÑ.
-
ÐÑдел Ð¼Ð¾Ð¶ÐµÑ ÑоÑÑоÑÑÑ Ð¸Ð· маÑÑива ÑабоÑников. ÐапÑимеÑ, в оÑделе
salesÑабоÑаÑÑ 2 ÑоÑÑÑдника: Ðжон и ÐлиÑа. -
Ðли оÑдел Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазделÑн на подоÑделÑ, напÑимеÑ, оÑдел
developmentÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· подоÑделов:sitesиinternals. Ркаждом подоÑделе еÑÑÑ Ñвой пеÑÑонал. -
Также возможно, ÑÑо пÑи ÑоÑÑе подоÑдела он делиÑÑÑ Ð½Ð° подÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ (или командÑ).
ÐапÑимеÑ, подоÑдел
sitesв бÑдÑÑем Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑазделÑн на командÑsiteAиsiteB. РпоÑенÑиалÑно они могÑÑ Ð±ÑÑÑ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ñ ÐµÑÑ. ÐÑого Ð½ÐµÑ Ð½Ð° каÑÑинке, пÑоÑÑо нÑжно имеÑÑ ÑÑо в видÑ.
ТепеÑÑ, допÑÑÑим, нам нÑжна ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑÐ¼Ð¼Ñ Ð²ÑÐµÑ Ð·Ð°ÑплаÑ. Ðак Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑÑо ÑделаÑÑ?
ÐÑеÑаÑивнÑй подÑ
од не пÑоÑÑ, поÑÐ¾Ð¼Ñ ÑÑо ÑÑÑÑкÑÑÑа доволÑно ÑложнаÑ. ÐеÑÐ²Ð°Ñ Ð¸Ð´ÐµÑ Ð·Ð°ÐºÐ»ÑÑаеÑÑÑ Ð² Ñом, ÑÑÐ¾Ð±Ñ ÑделаÑÑ Ñикл for повеÑÑ
обÑекÑа company Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñм Ñиклом над оÑделами 1-го ÑÑÐ¾Ð²Ð½Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи. Ðо заÑем нам нÑжно болÑÑе вложеннÑÑ
Ñиклов Ð´Ð»Ñ Ð¸ÑеÑаÑий над ÑоÑÑÑдниками оÑделов вÑоÑого ÑÑовнÑ, ÑакиÑ
как sites⦠РзаÑем еÑÑ Ð¾Ð´Ð¸Ð½ Ñикл по оÑделам 3-го ÑÑовнÑ, коÑоÑÑе могÑÑ Ð¿Ð¾ÑвиÑÑÑÑ Ð² бÑдÑÑем? ÐÑли Ð¼Ñ Ð¿Ð¾Ð¼ÐµÑÑим в код 3-4 вложеннÑÑ
Ñикла Ð´Ð»Ñ Ð¾Ð±Ñ
ода одного обÑекÑа, Ñо ÑÑо бÑÐ´ÐµÑ Ð´Ð¾Ð²Ð¾Ð»Ñно некÑаÑиво.
ÐавайÑе попÑобÑем ÑекÑÑÑиÑ.
Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, когда наÑа ÑÑнкÑÐ¸Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð¾Ñдел Ð´Ð»Ñ Ð¿Ð¾Ð´ÑÑÑÑа ÑÑÐ¼Ð¼Ñ Ð·Ð°ÑплаÑ, еÑÑÑ Ð´Ð²Ð° возможнÑÑ ÑлÑÑаÑ:
- Ðибо ÑÑо «пÑоÑÑой» оÑдел Ñ Ð¼Ð°ÑÑивом â Ñогда Ð¼Ñ Ñможем ÑÑммиÑоваÑÑ Ð·Ð°ÑплаÑÑ Ð² пÑоÑÑом Ñикле.
- Ðли ÑÑо обÑÐµÐºÑ Ñ
NподоÑделами â Ñогда Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑделаÑÑNÑекÑÑÑивнÑÑ Ð²Ñзовов, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑÑÐ¼Ð¼Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ из подоÑделов, и обÑединиÑÑ ÑезÑлÑÑаÑÑ.
СлÑÑай (1), когда Ð¼Ñ Ð¿Ð¾Ð»ÑÑили маÑÑив, ÑвлÑеÑÑÑ Ð±Ð°Ð·Ð¾Ð¹ ÑекÑÑÑии, ÑÑивиалÑнÑм ÑлÑÑаем.
СлÑÑай (2), пÑи полÑÑении обÑекÑа, ÑвлÑеÑÑÑ Ñагом ÑекÑÑÑии. Ð¡Ð»Ð¾Ð¶Ð½Ð°Ñ Ð·Ð°Ð´Ð°Ñа ÑазделÑеÑÑÑ Ð½Ð° подзадаÑи Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¾Ñделов. Ðни могÑÑ, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, Ñнова ÑазделиÑÑÑÑ Ð½Ð° подоÑделÑ, но Ñано или поздно ÑÑо Ñазделение законÑиÑÑÑ, и ÑеÑение ÑведÑÑÑÑ Ðº ÑлÑÑÐ°Ñ (1).
ÐлгоÑиÑм даже пÑоÑе ÑиÑаеÑÑÑ Ð² виде кода:
let company = { // ÑÐ¾Ñ Ð¶Ðµ ÑамÑй обÑекÑ, ÑжаÑÑй Ð´Ð»Ñ ÐºÑаÑкоÑÑи
sales: [{name: 'John', salary: 1000}, {name: 'Alice', salary: 600 }],
development: {
sites: [{name: 'Peter', salary: 2000}, {name: 'Alex', salary: 1800 }],
internals: [{name: 'Jack', salary: 1300}]
}
};
// ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÑÑÑÑа ÑÑÐ¼Ð¼Ñ Ð·Ð°ÑплаÑ
function sumSalaries(department) {
if (Array.isArray(department)) { // ÑлÑÑай (1)
return department.reduce((prev, current) => prev + current.salary, 0); // ÑÑмма ÑлеменÑов маÑÑива
} else { // ÑлÑÑай (2)
let sum = 0;
for (let subdep of Object.values(department)) {
sum += sumSalaries(subdep); // ÑекÑÑÑивно вÑзÑваеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¾Ñделов, ÑÑммиÑÑÑ ÑезÑлÑÑаÑÑ
}
return sum;
}
}
alert(sumSalaries(company)); // 6700
Ðод кÑаÑок и пÑоÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ (надеÑÑÑ?). Ð ÑÑом Ñила ÑекÑÑÑии. Ðна ÑабоÑÐ°ÐµÑ Ð½Ð° лÑбом ÑÑовне вложенноÑÑи оÑделов.
Ð¡Ñ ÐµÐ¼Ð° вÑзовов:
ÐÑинÑип пÑоÑÑ: Ð´Ð»Ñ Ð¾Ð±ÑекÑа {...} иÑполÑзÑÑÑÑÑ ÑекÑÑÑивнÑе вÑзовÑ, а маÑÑÐ¸Ð²Ñ [...] ÑвлÑÑÑÑÑ Â«Ð»Ð¸ÑÑÑÑми» деÑева ÑекÑÑÑии, они ÑÑÐ°Ð·Ñ Ð´Ð°ÑÑ ÑезÑлÑÑаÑ.
ÐбÑаÑиÑе внимание, ÑÑо в коде иÑполÑзÑÑÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑи, о коÑоÑÑÑ Ð¼Ñ Ð³Ð¾Ð²Ð¾Ñили Ñанее:
- ÐеÑод
arr.reduceиз Ð³Ð»Ð°Ð²Ñ ÐеÑÐ¾Ð´Ñ Ð¼Ð°ÑÑивов Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑÑÐ¼Ð¼Ñ ÑлеменÑов маÑÑива. - Цикл
for(val of Object.values(obj))Ð´Ð»Ñ Ð¸ÑеÑаÑии по знаÑениÑм обÑекÑа:Object.valuesвозвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив знаÑений.
РекÑÑÑивнÑе ÑÑÑÑкÑÑÑÑ
РекÑÑÑÐ¸Ð²Ð½Ð°Ñ (ÑекÑÑÑивно опÑеделÑемаÑ) ÑÑÑÑкÑÑÑа даннÑÑ â ÑÑо ÑÑÑÑкÑÑÑа, коÑоÑÐ°Ñ Ð¿Ð¾Ð²ÑоÑÑÐµÑ ÑÐ°Ð¼Ñ ÑÐµÐ±Ñ Ð² ÑÐ²Ð¾Ð¸Ñ ÑаÑÑÑÑ .
ÐÑ ÑолÑко ÑÑо видели ÑÑо на пÑимеÑе ÑÑÑÑкÑÑÑÑ ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ð¸ вÑÑе.
ÐÑдел компании â ÑÑо:
- Ðибо маÑÑив лÑдей.
- Ðибо обÑÐµÐºÑ Ñ Ð¾Ñделами.
ÐÐ»Ñ Ð²ÐµÐ±-ÑазÑабоÑÑиков ÑÑÑеÑÑвÑÑÑ Ð³Ð¾Ñаздо более извеÑÑнÑе пÑимеÑÑ: HTML- и XML-докÑменÑÑ.
Ð HTML-докÑменÑе HTML-Ñег Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ:
- ФÑагменÑÑ ÑекÑÑа.
- HTML-комменÑаÑии.
- ÐÑÑгие HTML-Ñеги (коÑоÑÑе, в ÑÐ²Ð¾Ñ Ð¾ÑеÑедÑ, могÑÑ ÑодеÑжаÑÑ ÑÑагменÑÑ ÑекÑÑа/комменÑаÑии или дÑÑгие Ñеги и Ñ.д.).
ÐÑо Ñнова ÑекÑÑÑивное опÑеделение.
ÐÐ»Ñ Ð»ÑÑÑего Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¼Ñ ÑаÑÑмоÑÑим еÑÑ Ð¾Ð´Ð½Ñ ÑекÑÑÑивнÑÑ ÑÑÑÑкÑÑÑÑ Ð¿Ð¾Ð´ названием «ÑвÑзнÑй ÑпиÑок», коÑоÑÐ°Ñ Ð² некоÑоÑÑÑ ÑлÑÑаÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð² каÑеÑÑве алÑÑеÑнаÑÐ¸Ð²Ñ Ð¼Ð°ÑÑивÑ.
СвÑзнÑй ÑпиÑок
ÐÑедÑÑавÑÑе Ñебе, ÑÑо Ð¼Ñ Ñ Ð¾Ñим Ñ ÑаниÑÑ ÑпоÑÑдоÑеннÑй ÑпиÑок обÑекÑов.
ÐÑÑеÑÑвеннÑм вÑбоÑом бÑÐ´ÐµÑ Ð¼Ð°ÑÑив:
let arr = [obj1, obj2, obj3];
â¦Ðо Ñ Ð¼Ð°ÑÑивов еÑÑÑ Ð½ÐµÐ´Ð¾ÑÑаÑки. ÐпеÑаÑии «ÑдалиÑÑ ÑлеменÑ» и «вÑÑавиÑÑ ÑлеменÑ» ÑвлÑÑÑÑÑ Ð´Ð¾ÑогоÑÑоÑÑими. ÐапÑимеÑ, опеÑаÑÐ¸Ñ arr.unshift(obj) должна пеÑеиндекÑиÑоваÑÑ Ð²Ñе ÑлеменÑÑ, ÑÑÐ¾Ð±Ñ Ð¾ÑвободиÑÑ Ð¼ÐµÑÑо Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ obj, и, еÑли маÑÑив болÑÑой, на ÑÑо поÑÑебÑеÑÑÑ Ð²ÑемÑ. То же Ñамое Ñ arr.shift().
ÐдинÑÑвеннÑе ÑÑÑÑкÑÑÑнÑе изменениÑ, не ÑÑебÑÑÑие маÑÑовой пеÑеиндекÑаÑии â ÑÑо изменениÑ, коÑоÑÑе вÑполнÑÑÑÑÑ Ñ ÐºÐ¾Ð½Ñа маÑÑива: arr.push/pop. Таким обÑазом, маÑÑив Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð²Ð¾Ð»Ñно медленнÑм Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑиÑ
оÑеÑедей, когда нам пÑиÑ
одиÑÑÑ ÑабоÑаÑÑ Ñ ÐµÐ³Ð¾ наÑалом.
Ðли же, еÑли нам дейÑÑвиÑелÑно нÑÐ¶Ð½Ñ Ð±ÑÑÑÑÑе вÑÑавка/Ñдаление, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑбÑаÑÑ Ð´ÑÑгÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð½ÑÑ , назÑваемÑÑ ÑвÑзнÑй ÑпиÑок.
ÐÐ»ÐµÐ¼ÐµÐ½Ñ ÑвÑзного ÑпиÑка опÑеделÑеÑÑÑ ÑекÑÑÑивно как обÑÐµÐºÑ Ñ:
value,nextâ ÑвойÑÑво, ÑÑÑлаÑÑееÑÑ Ð½Ð° ÑледÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑвÑзного ÑпиÑка илиnull, еÑли ÑÑо поÑледний ÑлеменÑ.
ÐÑимеÑ:
let list = {
value: 1,
next: {
value: 2,
next: {
value: 3,
next: {
value: 4,
next: null
}
}
}
};
ÐÑаÑиÑеÑкое пÑедÑÑавление ÑпиÑка:
ÐлÑÑеÑнаÑивнÑй код Ð´Ð»Ñ ÑозданиÑ:
let list = { value: 1 };
list.next = { value: 2 };
list.next.next = { value: 3 };
list.next.next.next = { value: 4 };
list.next.next.next.next = null;
ÐдеÑÑ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ еÑÑ Ð»ÑÑÑе ÑвидеÑÑ, ÑÑо еÑÑÑ Ð½ÐµÑколÑко обÑекÑов, каждÑй из коÑоÑÑÑ
Ð¸Ð¼ÐµÐµÑ value и next, ÑказÑваÑÑий на ÑоÑеда. ÐеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ list ÑвлÑеÑÑÑ Ð¿ÐµÑвÑм обÑекÑом в ÑепоÑке, поÑÑомÑ, ÑледÑÑ Ð¿Ð¾ ÑказаÑелÑм next из неÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ попаÑÑÑ Ð² лÑбой ÑлеменÑ.
СпиÑок можно легко ÑазделиÑÑ Ð½Ð° неÑколÑко ÑаÑÑей и впоÑледÑÑвии обÑединиÑÑ Ð¾Ð±ÑаÑно:
let secondList = list.next.next;
list.next.next = null;
ÐÐ»Ñ Ð¾Ð±ÑединениÑ:
list.next.next = secondList;
Ð, конеÑно, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑÑавиÑÑ Ð¸Ð»Ð¸ ÑдалиÑÑ ÑлеменÑÑ Ð¸Ð· лÑбого меÑÑа.
ÐапÑимеÑ, Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑлеменÑа нам нÑжно обновиÑÑ Ð¿ÐµÑвÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпиÑка:
let list = { value: 1 };
list.next = { value: 2 };
list.next.next = { value: 3 };
list.next.next.next = { value: 4 };
list.next.next.next.next = null;
// добавление нового ÑлеменÑа в ÑпиÑок
list = { value: "new item", next: list };
ЧÑÐ¾Ð±Ñ ÑдалиÑÑ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð· ÑеÑÐµÐ´Ð¸Ð½Ñ ÑпиÑка, нÑжно измениÑÑ Ð·Ð½Ð°Ñение next пÑедÑдÑÑего ÑлеменÑа:
list.next = list.next.next;
list.next пеÑепÑÑгнÑло Ñ 1 на знаÑение 2. ÐнаÑение 1 ÑепеÑÑ Ð¸ÑклÑÑено из ÑепоÑки. ÐÑли оно не Ñ
ÑаниÑÑÑ Ð³Ð´Ðµ-нибÑÐ´Ñ ÐµÑÑ, оно бÑÐ´ÐµÑ Ð°Ð²ÑомаÑиÑеÑки Ñдалено из памÑÑи.
РоÑлиÑие Ð¾Ñ Ð¼Ð°ÑÑивов, Ð½ÐµÑ Ð¿ÐµÑенÑмеÑаÑии, ÑлеменÑÑ Ð»ÐµÐ³ÐºÐ¾ пеÑеÑÑавлÑÑÑÑÑ.
ÐÑÑеÑÑвенно, ÑпиÑки не вÑегда лÑÑÑе маÑÑивов. РпÑоÑивном ÑлÑÑае вÑе полÑзовалиÑÑ Ð±Ñ ÑолÑко ÑпиÑками.
ÐлавнÑм недоÑÑаÑком ÑвлÑеÑÑÑ Ñо, ÑÑо Ð¼Ñ Ð½Ðµ можем легко полÑÑиÑÑ Ð´Ð¾ÑÑÑп к ÑлеменÑÑ Ð¿Ð¾ его индекÑÑ. РпÑоÑÑом маÑÑиве: arr[n] ÑвлÑеÑÑÑ Ð¿ÑÑмой ÑÑÑлкой. Ðо в ÑпиÑке Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð°ÑаÑÑ Ñ Ð¿ÐµÑвого ÑлеменÑа и пеÑейÑи в next N Ñаз, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ N-й ÑлеменÑ.
â¦Ðо нам не вÑегда нÑÐ¶Ð½Ñ Ñакие опеÑаÑии. ÐапÑимеÑ, нам Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ñжна оÑеÑÐµÐ´Ñ Ð¸Ð»Ð¸ даже двÑÑ ÑÑоÑоннÑÑ Ð¾ÑеÑÐµÐ´Ñ â ÑÑо ÑпоÑÑдоÑÐµÐ½Ð½Ð°Ñ ÑÑÑÑкÑÑÑа, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¾ÑÐµÐ½Ñ Ð±ÑÑÑÑо добавлÑÑÑ/ÑдалÑÑÑ ÑлеменÑÑ Ñ Ð¾Ð±Ð¾Ð¸Ñ ÐºÐ¾Ð½Ñов, но Ñам не нÑжен доÑÑÑп в ÑеÑединÑ.
СпиÑки могÑÑ Ð±ÑÑÑ ÑлÑÑÑенÑ:
- Ðожно добавиÑÑ ÑвойÑÑво
prevв дополнение кnextÐ´Ð»Ñ ÑÑÑлки на пÑедÑдÑÑий ÑлеменÑ, ÑÑÐ¾Ð±Ñ Ð»ÐµÐ³ÐºÐ¾ двигаÑÑÑÑ Ð¿Ð¾ ÑпиÑÐºÑ Ð½Ð°Ð·Ð°Ð´. - Ðожно Ñакже добавиÑÑ Ð¿ÐµÑеменнÑÑ
tail, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° поÑледний ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑпиÑка (и обновлÑÑÑ ÐµÑ Ð¿Ñи добавлении/Ñдалении ÑлеменÑов Ñ ÐºÐ¾Ð½Ñа). - â¦ÐÐ¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð´ÑÑгие изменениÑ: главное, ÑÑÐ¾Ð±Ñ ÑÑÑÑкÑÑÑа даннÑÑ ÑооÑвеÑÑÑвовала наÑим задаÑам Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð¿ÑоизводиÑелÑноÑÑи и ÑдобÑÑва.
ÐÑого
ТеÑминÑ:
-
РекÑÑÑÐ¸Ñ â ÑÑо ÑеÑмин в пÑогÑаммиÑовании, ознаÑаÑÑий вÑзов ÑÑнкÑией Ñамой ÑебÑ. РекÑÑÑивнÑе ÑÑнкÑии могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ ÑлеганÑного ÑеÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÑеделÑннÑÑ Ð·Ð°Ð´Ð°Ñ.
Ðогда ÑÑнкÑÐ¸Ñ Ð²ÑзÑÐ²Ð°ÐµÑ ÑÐ°Ð¼Ñ ÑебÑ, ÑÑо назÑваеÑÑÑ Ñагом ÑекÑÑÑии. Ðаза ÑекÑÑÑии â ÑÑо Ñакие аÑгÑменÑÑ ÑÑнкÑии, коÑоÑÑе делаÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð½Ð°ÑÑолÑко пÑоÑÑой, ÑÑо ÑеÑение не ÑÑебÑÐµÑ Ð´Ð°Ð»ÑнейÑÐ¸Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½ÑÑ Ð²Ñзовов.
-
РекÑÑÑивно опÑеделÑÐµÐ¼Ð°Ñ ÑÑÑÑкÑÑÑа даннÑÑ â ÑÑо ÑÑÑÑкÑÑÑа даннÑÑ , коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿Ñеделена Ñ Ð¸ÑполÑзованием Ñамой ÑебÑ.
ÐапÑимеÑ, ÑвÑзнÑй ÑпиÑок Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð¿ÑеделÑн как ÑÑÑÑкÑÑÑа даннÑÑ , ÑоÑÑоÑÑÐ°Ñ Ð¸Ð· обÑекÑа, ÑодеÑжаÑего ÑÑÑÐ»ÐºÑ Ð½Ð° ÑпиÑок (или null).
list = { value, next -> list }ÐеÑевÑÑ, Ñакие как деÑево HTML-ÑлеменÑов или деÑево оÑделов из ÑÑой главÑ, Ñакже ÑвлÑÑÑÑÑ ÑекÑÑÑивнÑми: Ñ Ð½Ð¸Ñ ÐµÑÑÑ Ð²ÐµÑви, и ÐºÐ°Ð¶Ð´Ð°Ñ Ð²ÐµÑÐ²Ñ Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð´ÑÑгие веÑви.
Ðак Ð¼Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ в пÑимеÑе
sumSalary, ÑекÑÑÑивнÑе ÑÑнкÑии могÑÑ Ð±ÑÑÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ñ Ð´Ð»Ñ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð° по ним.
ÐÑÐ±Ð°Ñ ÑекÑÑÑÐ¸Ð²Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÐµÑепиÑана в иÑеÑаÑивнÑÑ. Ð ÑÑо иногда ÑÑебÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии ÑабоÑÑ. Ðо Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¸Ñ Ð·Ð°Ð´Ð°Ñ ÑекÑÑÑивное ÑеÑение доÑÑаÑоÑно бÑÑÑÑое и пÑоÑÑое в напиÑании и поддеÑжке.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)