ÐавайÑе повеÑнемоÑÑ Ð´Ð¾ ÑÑнкÑÑй Ñ Ð²Ð¸Ð²Ñимо ÑÑ Ð±ÑлÑÑ Ð¿Ð¾Ð³Ð»Ð¸Ð±Ð»ÐµÐ½Ð¾.
ÐаÑÐ¾Ñ Ð¿ÐµÑÑÐ¾Ñ ÑÐµÐ¼Ð¾Ñ Ð±Ñде ÑекÑÑÑÑÑ.
ЯкÑо ви не новаÑок в пÑогÑамÑваннÑ, Ñо, мабÑÑÑ, Ð·Ð½Ð°Ð¹Ð¾Ð¼Ñ Ð· ÑекÑÑÑÑÑÑ, Ñ Ð¼Ð¾Ð¶ÐµÑе пÑопÑÑÑиÑи ÑÑ Ð³Ð»Ð°Ð²Ñ.
РекÑÑÑÑÑ â Ñе паÑÑеÑн, Ñкий Ñ ÐºÐ¾ÑиÑним Ñ ÑиÑÑаÑÑÑÑ , коли Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бÑÑи ÑоздÑлено на кÑлÑка Ð·Ð°Ð²Ð´Ð°Ð½Ñ Ñого ж ÑодÑ, але пÑоÑÑÑÑÐ¸Ñ . Ðбо коли Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ Ð¼Ð¾Ð¶Ðµ бÑÑи ÑпÑоÑене до пÑоÑÑÐ¾Ñ Ð´ÑÑ Ð¿Ð»ÑÑ Ð¿ÑоÑÑÑÑий ваÑÑÐ°Ð½Ñ Ñого ж завданнÑ. Ðбо, Ñк ми побаÑимо найближÑим ÑаÑом, Ñоб пÑаÑÑваÑи з певними ÑÑÑÑкÑÑÑами Ð´Ð°Ð½Ð¸Ñ .
Ðоли ÑÑнкÑÑÑ Ð²Ð¸ÑÑÑÑÑ Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ, Ñ Ð¿ÑоÑеÑÑ Ð²Ð¾Ð½Ð° може викликаÑи багаÑо ÑнÑÐ¸Ñ ÑÑнкÑÑй. РнавÑÑÑ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸, коли ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ ÑÐ°Ð¼Ñ Ñебе. Ðоли ÑÑнкÑÑÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ñ ÑÐ°Ð¼Ñ Ñебе â Ñе називаÑÑÑÑÑ ÑекÑÑÑÑÑ.
Ðва ÑпоÑоби миÑленнÑ
Щоб поÑаÑи з ÑогоÑÑ Ð¿ÑоÑÑого â давайÑе напиÑемо ÑÑнкÑÑÑ 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). Що Ñ Ð¼Ð°ÑемаÑиÑÑ Ð¼Ð¾Ð¶Ð½Ð° напиÑаÑи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. ÐÑлÑкÑÑÑÑ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑв, на ÑÐºÑ ÑоÑно можна ÑозÑÐ°Ñ Ð¾Ð²ÑваÑи â 10 000. ÐеÑÐºÑ ÑÑÑÑÑ Ð´Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð¿ÑаÑÑваÑи з Ñе бÑлÑÑÐ¾Ñ Ð³Ð»Ð¸Ð±Ð¸Ð½Ð¾Ñ. Ðле навÑÑÑ Ð±ÑлÑÑÑÑÑÑ Ð· Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÑÑÑ Ð¾ÑилиÑи не бÑлÑÑе 100 000 викликÑв. РбагаÑо авÑомаÑиÑÐ½Ð¸Ñ Ð¾Ð¿ÑимÑзаÑÑй, ÑÐºÑ Ð´Ð¾Ð¿Ð¾Ð¼Ð°Ð³Ð°ÑÑÑ ÑникнÑÑи пеÑÐµÐ¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ ÑÑÐµÐºÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÑв (âопÑимÑзаÑÑÑ Ñ Ð²Ð¾ÑÑÐ¾Ð²Ð¸Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑвâ, англ. âtail call optimizationsâ), але вони пÑдÑÑимÑÑÑÑÑÑ Ð´Ð°Ð»ÐµÐºÐ¾ не вÑÑди Ñ Ð¿ÑаÑÑÑÑÑ ÑÑлÑки в пÑоÑÑÐ¸Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ°Ñ .
Це обмежÑÑ Ð·Ð°ÑÑоÑÑÐ²Ð°Ð½Ð½Ñ ÑекÑÑÑÑÑ, але вона вÑе Ñе залиÑаÑÑÑÑÑ Ð´Ñже ÑиÑоко поÑиÑеноÑ. РбагаÑо завданÑ, де ÑекÑÑÑивний ÑпоÑÑб миÑÐ»ÐµÐ½Ð½Ñ Ð´Ð°Ñ Ð¿ÑоÑÑÑÑий код, Ñкий легÑе пÑдÑÑимÑваÑи.
ÐонÑекÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ñа ÑÑек
Ð¢ÐµÐ¿ÐµÑ Ð´Ð°Ð²Ð°Ð¹Ñе ÑозглÑнемо ÑобоÑÑ ÑекÑÑÑÐ¸Ð²Ð½Ð¸Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑв. ÐÐ»Ñ ÑÑого ми подивимоÑÑ Ð¿Ñд ÐºÐ°Ð¿Ð¾Ñ ÑÑнкÑÑй.
ÐнÑоÑмаÑÑÑ Ð¿Ñо пÑоÑÐµÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ°Ð½Ð¾Ñ ÑÑнкÑÑÑ Ð·Ð±ÐµÑÑгаÑÑÑÑÑ Ñ ÐºÐ¾Ð½ÑекÑÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ.
ÐонÑекÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ â Ñе внÑÑÑÑÑÐ½Ñ ÑÑÑÑкÑÑÑа даниÑ
, Ñка мÑÑÑиÑÑ Ð´ÐµÑÐ°Ð»Ñ Ð¿Ñо Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ ÑÑнкÑÑÑ: де заÑаз кеÑÑÑÑий поÑÑк, поÑоÑÐ½Ñ Ð·Ð¼ÑннÑ, знаÑÐµÐ½Ð½Ñ this (ми не викоÑиÑÑовÑÑмо його ÑÑÑ) Ñ ÐºÑлÑка ÑнÑиÑ
внÑÑÑÑÑнÑÑ
деÑалей.
Ðдин виклик ÑÑнкÑÑÑ Ð¼Ð°Ñ ÑÑвно один конÑекÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ, повâÑзаний з ним.
Ðоли ÑÑнкÑÑÑ ÑобиÑÑ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¸Ð¹ виклик, вÑдбÑваÑÑÑÑÑ Ð½Ð°ÑÑÑпне:
- ÐоÑоÑна ÑÑнкÑÑÑ Ð·ÑпинÑÑÑÑÑÑ.
- ÐонÑекÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ, повâÑзаний з неÑ, запамâÑÑовÑÑÑÑÑÑ Ð² ÑпеÑÑалÑнÑй ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð¸Ñ , Ñо називаÑÑÑÑÑ ÑÑек конÑекÑÑÑв виконаннÑ.
- ÐиконÑÑÑÑÑÑ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÐ¸ Ñ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ з Ð½Ð¸Ñ ÑÑвоÑÑÑÑÑÑÑ ÑвÑй конÑекÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ.
- ÐÑÑÐ»Ñ Ð·Ð°ÐºÑнÑеннÑ, ÑÑаÑий конÑекÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð²Ð¸ÑÑгÑÑÑÑÑÑ Ð· ÑÑека, Ñ Ð·Ð¾Ð²Ð½ÑÑÐ½Ñ ÑÑнкÑÑÑ Ð²ÑдновлÑÑÑÑÑÑ Ð· Ñого мÑÑÑÑ, де вона зÑпинилаÑÑ.
ÐавайÑе подивимоÑÑ, Ñо вÑдбÑваÑÑÑÑÑ Ð¿Ñд ÑÐ°Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ pow(2, 3).
pow(2, 3)
Ðа поÑаÑÐºÑ Ð²Ð¸ÐºÐ»Ð¸ÐºÑ pow(2, 3) конÑекÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð±Ñде збеÑÑгаÑи змÑннÑ: x = 2, n = 3, поÑÑк Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð·Ð½Ð°Ñ
одиÑÑÑÑ Ð½Ð° ÑÑÐ´ÐºÑ 1 ÑÑнкÑÑÑ.
Ðи можемо намалÑваÑи його наÑÑÑпним Ñином:
- ÐонÑекÑÑ: {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(â¦) + pow(â¦) + somethingElse(â¦).
Ð¢Ð¾Ð¼Ñ Ð±Ñло б ÑоÑнÑÑе ÑказаÑи, Ñо Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ Ð¿ÑодовжÑÑÑÑÑÑ âвÑдÑÐ°Ð·Ñ Ð¿ÑÑÐ»Ñ Ð¿ÑдвикликÑâ.
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)
ÐаÑаз ÑÑнÑÑ 2 ÑÑаÑÑ ÐºÐ¾Ð½ÑекÑÑи Ñ 1 заÑаз пÑаÑÑÑ Ð´Ð»Ñ 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 конÑекÑÑÑв, Ð´Ð»Ñ Ð²ÑÑÑ
знаÑенÑ, Ñо нижÑе 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: 'Ðван',
salary: 1000
}, {
name: 'ÐлÑÑа',
salary: 1600
}],
development: {
sites: [{
name: 'ÐеÑÑо',
salary: 2000
}, {
name: 'ÐлекÑандÑ',
salary: 1800
}],
internals: [{
name: 'Ðвген',
salary: 1300
}]
}
};
ÐнÑими Ñловами, компанÑÑ Ð¼Ð°Ñ Ð²ÑддÑли.
-
ÐÑддÑли можÑÑÑ Ð¼Ð°Ñи маÑив пеÑÑоналÑ. ÐапÑиклад, вÑддÑл пÑÐ¾Ð´Ð°Ð¶Ñ Ð¼Ð°Ñ 2 ÑпÑвÑобÑÑника: Ðван Ñа ÐлÑÑа.
-
Ðбо вÑддÑл може бÑÑи ÑоздÑленим на пÑдÑоздÑли, напÑиклад,
developmentÐ¼Ð°Ñ Ð´Ð²Ñ Ð³Ñлки:sitesÑаinternals. Ðожна з Ð½Ð¸Ñ Ð¼Ð°Ñ ÑвÑй пеÑÑонал. -
Ðожливо Ñакож, Ñо коли вÑддÑл зÑоÑÑаÑ, вÑн ÑоздÑлÑÑÑÑÑÑ Ð½Ð° ÑÑбвÑддÑли (або команди).
ÐапÑиклад, вÑддÑл
sitesÑ Ð¼Ð°Ð¹Ð±ÑÑнÑÐ¾Ð¼Ñ Ð¼Ð¾Ð¶Ðµ бÑÑи ÑоздÑлений на команди длÑsiteAÑsiteB. Рвони, поÑенÑÑйно, можÑÑÑ Ð±ÑÑи ÑоздÑÐ»ÐµÐ½Ñ Ð² подалÑÑомÑ. Це не зобÑажено на малÑнкÑ, пÑоÑÑо ÑлÑд маÑи Ñе на ÑвазÑ.
Ð¢ÐµÐ¿ÐµÑ Ð¿ÑипÑÑÑÑмо, Ñо ми Ñ Ð¾Ñемо, Ñоб ÑÑнкÑÑÑ Ð¾ÑÑимала ÑÑÐ¼Ñ Ð²ÑÑÑ Ð·Ð°ÑплаÑ. Як ми можемо Ñе зÑобиÑи?
ÐÑеÑаÑивний пÑдÑ
Ñд нелегкий, бо ÑÑÑÑкÑÑÑа не пÑоÑÑа. ÐеÑÑа ÑÐ´ÐµÑ Ð¼Ð¾Ð¶Ðµ полÑгаÑи в ÑомÑ, Ñоб зÑобиÑи for Ñикл ÑеÑез company з вкладеним пÑдÑиклами ÑеÑез 1-ий ÑÑÐ²ÐµÐ½Ñ Ð²ÑддÑлÑв. Ðле ÑÐ¾Ð´Ñ Ð½Ð°Ð¼ поÑÑÑбно бÑлÑÑе вкладениÑ
ÑиклÑв, Ñоб ÑÑеÑÑваÑиÑÑ ÑеÑез пеÑÑонал Ñ 2-Ð¼Ñ ÑÑвнÑ, ÑÐ°ÐºÐ¾Ð¼Ñ Ñк sites⦠РпоÑÑм Ñе один пÑдÑикл вÑеÑÐµÐ´Ð¸Ð½Ñ Ð½Ð¸Ñ
Ð´Ð»Ñ 3-го ÑÑвнÑ, Ñкий мÑг би зâÑвиÑиÑÑ Ð² майбÑÑнÑомÑ? ЯкÑо ми поÑÑавимо 3-4 Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ñ Ñикли Ñ ÐºÐ¾Ð´Ñ, Ñоб пÑойÑи один обâÑкÑ, Ñе ÑÑÐ°Ñ Ð´Ð¾ÑиÑÑ Ð¿Ð¾ÑвоÑним.
ÐавайÑе ÑпÑобÑÑмо ÑекÑÑÑÑÑ.
Як ми баÑимо, коли наÑа ÑÑнкÑÑÑ Ð¾ÑÑимÑÑ Ð²ÑддÑл Ð´Ð»Ñ Ð¿ÑдÑÐ°Ñ ÑÐ½ÐºÑ ÑÑми заÑплаÑ, Ñ Ð´Ð²Ð° Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ñ Ð²Ð¸Ð¿Ð°Ð´ÐºÐ¸:
- Ðбо Ñе âпÑоÑÑийâ вÑддÑл з маÑивом лÑдей â ÑÐ¾Ð´Ñ Ð¼Ð¸ можемо пÑдÑÑмÑваÑи заÑплаÑÑ Ð² пÑоÑÑÐ¾Ð¼Ñ ÑиклÑ.
- Ðбо Ñе обâÑÐºÑ Ð·
nпÑдвÑддÑлÑв â ÑÐ¾Ð´Ñ Ð¼Ð¸ можемо зÑобиÑиnÑекÑÑÑÐ¸Ð²Ð½Ð¸Ñ Ð²Ð¸ÐºÐ»Ð¸ÐºÑв, Ñоб оÑÑимаÑи ÑÑÐ¼Ñ Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ з пÑдвÑддÑлÑв Ñа ÑÑмÑваÑи ÑезÑлÑÑаÑи.
1-й випадок Ñ Ð±Ð°Ð·Ð¾Ñ ÑекÑÑÑÑÑ, ÑÑивÑалÑним випадком, коли ми оÑÑимÑÑмо маÑив.
2-й випадок, коли ми оÑÑимÑÑмо обâÑкÑ, â Ñе ÑекÑÑÑивний кÑок. ÐомплекÑне Ð·Ð°Ð²Ð´Ð°Ð½Ð½Ñ ÑоздÑлÑÑÑÑÑÑ Ð½Ð° пÑдзадаÑÑ Ð´Ð»Ñ Ð¼ÐµÐ½ÑÐ¸Ñ Ð²ÑддÑлÑв. Ðони в ÑÐ²Ð¾Ñ ÑеÑÐ³Ñ Ð¼Ð¾Ð¶ÑÑÑ Ð·Ð½Ð¾Ð²Ñ Ð¿Ð¾Ð´ÑлÑÑиÑÑ Ð½Ð° пÑдвÑддÑли, але Ñано Ñи пÑзно подÑл закÑнÑиÑÑÑÑ Ñ Ð·Ð²ÐµÐ´ÐµÑÑÑÑ Ð´Ð¾ Ð²Ð¸Ð¿Ð°Ð´ÐºÑ (1).
ÐлгоÑиÑм, мабÑÑÑ, навÑÑÑ Ð»ÐµÐ³Ñе ÑиÑаÑи Ñ Ð²Ð¸Ð³Ð»ÑÐ´Ñ ÐºÐ¾Ð´Ñ:
let company = { // Ñой же обâÑкÑ, ÑÑиÑнÑÑий Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¿Ð°ÐºÑноÑÑÑ
sales: [{name: 'John', salary: 1000}, {name: 'Alice', salary: 1600 }],
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)); // 7700
Ðод коÑоÑкий Ñ Ð¹Ð¾Ð³Ð¾ легко зÑозÑмÑÑи (ÑподÑваÑÑÑ). Це Ñила ÑекÑÑÑÑÑ. ÐÑн Ñакож пÑаÑÑÑ Ð´Ð»Ñ Ð±ÑдÑ-Ñкого ÑÑÐ²Ð½Ñ Ð²ÐºÐ»Ð°Ð´ÐµÐ½Ð¾Ð³Ð¾ пÑдвÑддÑлÑ.
ÐÑÑ Ð´ÑагÑама викликÑв:
Ðи можемо легко побаÑиÑи пÑинÑип: Ð´Ð»Ñ Ð¾Ð±âÑкÑа {...} зÑÐ¾Ð±Ð»ÐµÐ½Ñ Ð¿Ñдвиклики, а маÑиви[â¦]` â âлиÑÑÑâ ÑекÑÑÑÑйного деÑева, вони даÑÑÑ Ð½ÐµÐ³Ð°Ð¹Ð½Ð¸Ð¹ ÑезÑлÑÑаÑ.
ÐаÑважÑе, Ñо код викоÑиÑÑовÑÑ ÐºÐ¾ÑиÑÐ½Ñ ÑÑнкÑÑÑ, ÑÐºÑ Ð¼Ð¸ вже ÑозглÑдали ÑанÑÑе:
- ÐеÑод
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. Таким Ñином, маÑив може бÑÑи доÑиÑÑ Ð¿Ð¾Ð²ÑлÑним Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ
ÑеÑг, коли ми Ð¿Ð¾Ð²Ð¸Ð½Ð½Ñ Ð¿ÑаÑÑваÑи з його поÑаÑком.
ÐÑÑм Ñого, ÑкÑо нам дÑйÑно поÑÑÑÐ±Ð½Ñ ÑÐ²Ð¸Ð´ÐºÑ Ð²ÑÑавка/видаленнÑ, ми можемо вибÑаÑи ÑнÑÑ ÑÑÑÑкÑÑÑÑ Ð´Ð°Ð½Ð¸Ñ , Ñка називаÑÑÑÑÑ Ð·Ð²âÑзаний ÑпиÑок, англ. âlinked listâ.
ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð·Ð²âÑзаного ÑпиÑÐºÑ ÑекÑÑÑивно визнаÑаÑÑÑÑÑ Ñк обâÑÐºÑ Ð·:
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 = { 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â¦)