Ø¨ÛØ§ÛÛØ¯ برگردÛ٠ب٠تابعâÙØ§ ٠آÙâÙØ§ را ع٠ÛÙâØªØ± Ù Ø·Ø§ÙØ¹Ù Ú©ÙÛÙ .
اÙÙÛÙ Ù ÙØ¶Ùع ٠ا بازگشت (recursion) Ø®ÙØ§Ùد Ø¨ÙØ¯.
اگر ش٠ا در Ø¨Ø±ÙØ§Ù ÙâÙÙÛØ³Û تازÙâکار ÙÛØ³ØªÛØ¯Ø Ø§ØØªÙ Ø§ÙØ§ اÛÙ Ø¨Ø±Ø§Û Ø´Ù Ø§ Ø¢Ø´ÙØ§ است Ù Ù ÛâØªÙØ§ÙÛØ¯ اÛÙ ÙØµÙ را رد Ú©ÙÛØ¯.
بازگشت ÛÚ© اÙÚ¯ÙÛ Ø¨Ø±ÙØ§Ù ÙâÙÙÛØ³Û است ک٠در Ù ÙØ§ÙØ¹Û Ú©Ù ÛÚ© کار Ø¨Ù Ø·ÙØ± Ø·Ø¨ÛØ¹Û Ù ÛâØªÙØ§Ùد ب٠ÚÙØ¯ کار از ÙÙØ¹ Ûکسا٠ا٠ا سادÙâØªØ± ØªÙØ³ÛÙ Ø´ÙØ¯ کاربرد دارد. ÛØ§ ز٠اÙÛ Ú©Ù Ú©Ø§Ø±Û Ù ÛâØªÙØ§Ùد ب٠ع٠ÙÛ Ø¢Ø³Ø§Ù Ø¨Ù Ø¹ÙØ§ÙÙâÛ ÛÚ© ÙÙØ¹ سادÙâØªØ± از Ù٠ا٠کار سادÙâØ³Ø§Ø²Û Ø´ÙØ¯. ÛØ§ ÙÙ Ø§ÙØ·Ùر Ú©Ù Ø¨Ù Ø²ÙØ¯Û Ø®ÙØ§ÙÛÙ Ø¯ÛØ¯Ø Ø¨Ø±Ø§Û Ú©ÙØ§Ø± آ٠د٠با Ø¨Ø¹Ø¶Û Ø§Ø² Ø³Ø§Ø®ØªØ§Ø±ÙØ§Û دادÙ.
ز٠اÙÛ Ú©Ù ÛÚ© تابع Ú©Ø§Ø±Û Ø±Ø§ Ø§ÙØ¬Ø§Ù Ù ÛâØ¯ÙØ¯Ø در ÙØ±Ø§ÛÙØ¯ Ø¢ÙØ تابع Ù ÛâØªÙØ§Ùد تعداد Ø²ÛØ§Ø¯Û از تابعâÙØ§Û دÛگر را ÙØ±Ø§ Ø¨Ø®ÙØ§Ùد. ÛÚ© Ù ÙØ±Ø¯ Ø¬Ø±Ø¦Û Ø§Ø² اÛÙ Ù ÙØ¶Ùع ز٠اÙÛ Ø§Ø³Øª ک٠تابع Ø®ÙØ¯Ø´ را ÙØ±Ø§Ø®ÙاÙÛ Ù ÛâÚ©ÙØ¯. ب٠اÛ٠ع٠٠بازگشت (recursion) Ù ÛâÚ¯ÙÛÙØ¯.
د٠طرز Ùکر
Ø¨Ø±Ø§Û Ø§ÛÙک٠با ÚÛØ²Û Ø³Ø§Ø¯Ù Ø´Ø±ÙØ¹ Ú©ÙÛÙ
Ø Ø¨ÛØ§ÛÛØ¯ بک تابع 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; // ضرب Ù ÛâÚ©ÙØ¯ x بار در n را result در ØÙÙÙ 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)را ب٠عÙÙØ§Ù ÙÙ Ø§ÛØ´ دÙÛÙ . در Ø±ÛØ§Ø¶ÛØ§ØªØ Ù Ù Ú©Ù Ø§Ø³Øª Ú©Ø³Û Ø§ÛÙÚ¯ÙÙÙ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));
}
ØØ¯Ø§Ú©Ø«Ø± تعداد ÙØ±Ø§Ø®ÙاÙÛâÙØ§Û ØªÙØ¯Ø±ØªÙ (شاÙ
٠اÙÙÛ ÙÙ
Ù
ÛâØ´ÙØ¯) را عÙ
٠بازگشت (recursion depth) Ù
ÛâÚ¯ÙÛÙØ¯. در Ù
ÙØ±Ø¯ Ù
Ø§Ø Ø§Û٠تعداد دÙÛÙØ§ n Ø®ÙØ§Ùد Ø¨ÙØ¯.
ع٠٠بازگشت ØØ¯Ø§Ú©Ø«Ø±Û ØªÙØ³Ø· Ù ÙØªÙر Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت Ù ØØ¯Ùد Ù ÛâØ´ÙØ¯. ٠ا Ù ÛâØªÙØ§ÙÛ٠ب٠10000 Ø¨ÙØ¯Ù آ٠اعت٠اد Ú©ÙÛÙ Ø Ø¨Ø¹Ø¶Û Ø§Ø² Ù ÙØªÙØ±ÙØ§ Ø¨ÛØ´ØªØ± را Ù٠٠جاز Ù ÛâØ¯Ø§ÙÙØ¯Ø ا٠ا 100000 Ø§ØØªÙ Ø§ÙØ§ از Ù ØØ¯ÙØ¯ÛØª Ø¨ÛØ´ØªØ± Ø¢ÙÙØ§ خارج است. بÙÛÙÙâØ³Ø§Ø²ÛâÙØ§Û Ø®ÙØ¯Ú©Ø§Ø±Û ÙØ³ØªÙد Ú©Ù Ø¨Ù Ú©Ø§ÙØ´ اÛ٠عدد Ú©Ù Ú© Ù ÛâÚ©ÙÙØ¯ («بÙÛÙÙâØ³Ø§Ø²ÛâÙØ§Û ÙØ±Ø§Ø®ÙاÙÛâÙØ§Û Ù¾ÛâØ¯Ø±âÙ¾Û») ا٠ا Ø¢ÙÙØ§ ÙÙÙØ² در ÙÙ ÙâØ¬Ø§ Ù¾Ø´ØªÛØ¨Ø§ÙÛ ÙÙ ÛâØ´ÙÙØ¯ Ù ÙÙØ· در Ù ÙØ§Ø±Ø¯ ساد٠کار Ù ÛâÚ©ÙÙØ¯.
اÛÙ Ù ÙØ¶Ùع کاربرد بازگشت را Ù ØØ¯Ùد Ù ÛâÚ©ÙØ¯ ا٠ا ÙÙÙØ² ÙÙ Ø¨Ø³ÛØ§Ø± گسترد٠است. Ú©Ø§Ø±ÙØ§Û Ø²ÛØ§Ø¯Û ÙØ³ØªÙد ک٠طرز Ùکر Ø¨Ø§Ø²Ú¯Ø´ØªÛØ Ø¨Ø±Ø§Û Ø¢ÙÙØ§ کد سادÙâØªØ± Ù Ø±Ø§ØØªâØªØ±Û Ø¯Ø± ÙÚ¯ÙØ¯Ø§Ø±Û ارائ٠٠ÛâØ¯ÙØ¯.
ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§ ٠پشتÙ
ØØ§Ùا Ø¨ÛØ§ÛÛØ¯ Ø¨Ø±Ø±Ø³Û Ú©ÙÛÙ Ú©Ù ÙØ±Ø§Ø®ÙاÙÛâÙØ§Û Ø¨Ø§Ø²Ú¯Ø´ØªÛ ÚÚ¯ÙÙ٠کار Ù ÛâÚ©ÙÙØ¯. Ø¨Ø±Ø§Û Ø§Û٠کار ٠ا Ø¨Ù Ø§ØªÙØ§Ùات پشت پرد٠در تابع Ùگا٠٠ÛâØ§ÙØ¯Ø§Ø²ÛÙ .
Ø§Ø·ÙØ§Ø¹Ø§ØªÛ Ú©Ù Ø¯Ø±Ø¨Ø§Ø±Ù ÙØ±Ø§ÛÙØ¯ Ø§Ø¬Ø±Ø§Û ÛÚ© تابع Ø¯Ø±ØØ§Ù اجرا ÙØ³ØªÙد در ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§ (execution context) Ø¢Ù Ø°Ø®ÛØ±Ù Ù ÛâØ´ÙÙØ¯.
زÙ
ÛÙÙâÛ Ø§Ø¬Ø±Ø§ ÛÚ© ساختار داد٠داخÙÛ Ø§Ø³Øª Ú©Ù Ø¬Ø²Ø¦ÛØ§ØªÛ Ø¯Ø±Ø¨Ø§Ø±Ù Ø§Ø¬Ø±Ø§Û ØªØ§Ø¨Ø¹ را شاÙ
Ù Ù
ÛâØ´ÙØ¯: جاÛÛ Ú©Ù Ø±ÙÙØ¯ Ú©ÙØªØ±Ù در Ø¢Ù Ø§Ø³ØªØ Ù
ØªØºÛØ±ÙØ§Û Ú©ÙÙÙÛØ Ù
ÙØ¯Ø§Ø± this (Ù
ا اÛÙØ¬Ø§ از Ø¢Ù Ø§Ø³ØªÙØ§Ø¯Ù ÙÙ
ÛâÚ©ÙÛÙ
) Ù ÚÙØ¯ ÚÛØ² داخÙÛ Ø¯Ûگر.
ÛÚ© ÙØ±Ø§Ø®ÙاÙÛ ØªØ§Ø¨Ø¹ دÙÛÙØ§ ÛÚ© ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§ دارد ک٠ب٠آ٠اختصاص دارد.
ز٠اÙÛ Ú©Ù ÛÚ© تابع ÙØ±Ø§Ø®ÙاÙÛ ØªÙØ¯Ø±ØªÙ Ù ÛâØ³Ø§Ø²Ø¯Ø Ù ÙØ§Ø±Ø¯ Ø²ÛØ± Ø§ØªÙØ§Ù Ù ÛâØ§ÙØªÙد:
- تابع Ú©ÙÙÙÛ Ù ÙÙØªØ§ ٠تÙÙÙ Ù ÛâØ´ÙØ¯.
- ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§Û Ø§Ø®ØªØµØ§Øµ ÛØ§Ùت٠ب٠آ٠در ÛÚ© ساختار داد٠خاص Ø¨Ù ÙØ§Ù پشت٠ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§ (execution context stack) Ø°Ø®ÛØ±Ù Ù ÛâØ´ÙØ¯.
- ÙØ±Ø§Ø®ÙاÙÛ ØªÙØ¯Ø±ØªÙ اجرا Ù ÛâØ´ÙØ¯.
- بعد از اÛÙÚ©Ù Ù¾Ø§ÛØ§Ù ÛØ§ÙØªØ Ø²Ù ÛÙÙâÛ Ø§Ø¬Ø±Ø§ ÙØ¨ÙÛ Ø§Ø² Ù¾Ø´ØªÙ Ø¯Ø±ÛØ§Ùت Ù ÛâØ´ÙØ¯ ٠تابع Ø¨ÛØ±ÙÙÛ Ø§Ø² جاÛÛ Ú©Ù Ù ØªÙÙÙ Ø´Ø¯Ù Ø¨ÙØ¯ ادا٠٠٠ÛâÛØ§Ø¨Ø¯.
Ø¨ÛØ§ÛÛØ¯ ببÛÙÛÙ
در ØÛÙ ÙØ±Ø§Ø®ÙاÙÛ pow(2, 3) ÚÙ Ø§ØªÙØ§ÙÛ Ù
ÛâØ§ÙØªØ¯.
تابع pow(2, 3)
در Ø§Ø¨ØªØ¯Ø§Û ÙØ±Ø§Ø®ÙاÙÛ pow(2, 3) زÙ
ÛÙÙâÛ Ø§Ø¬Ø±Ø§ Ù
ØªØºÛØ±Ùا را Ø°Ø®ÛØ±Ù Ù
ÛâÚ©ÙØ¯: x = 2, n = 3Ø Ù
Ø³ÛØ± اجرا ØØ§Ùا در خط 1 تابع ÙØ±Ø§Ø± دارد.
٠ا Ù ÛâØªÙØ§ÙÛ٠آ٠را ب٠اÛÙ ØµÙØ±Øª ÙÙ Ø§ÛØ´ دÙÛÙ :
- Context: { x: 2, n: 3, at line 1 } pow(2, 3)
اÛ٠زÙ
اÙÛ Ø§Ø³Øª ک٠تابع Ø´Ø±ÙØ¹ ب٠اجرا شد٠Ù
ÛâÚ©ÙØ¯. شرط n == 1 falsy است پس Ù
Ø³ÛØ± ب٠شاخ٠دÙÙ
if اداÙ
Ù Ù
ÛâØ¯ÙØ¯:
function pow(x, n) {
if (n == 1) {
return x;
} else {
return x * pow(x, n - 1);
}
}
alert( pow(2, 3) );
Ù ØªØºÛØ±Ùا ÛÚ©Ø³Ø§Ù ÙØ³ØªÙد ا٠ا خط تغÛÛØ± Ù ÛâÚ©ÙØ¯ پس ز٠ÛÙÙ Ø§ÙØ§Ù اÛÙÚ¯ÙÙ٠است:
- Context: { x: 2, n: 3, at line 5 } pow(2, 3)
Ø¨Ø±Ø§Û Ù
ØØ§Ø³Ø¨Ù x * pow(x, n - 1)Ø Ù
ا Ø¨Ø§ÛØ¯ ÛÚ© Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ Ø§Ø² pow با آرگÙÙ
اÙâÙØ§Û Ø¬Ø¯ÛØ¯ pow(2, 2) بسازÛÙ
.
تابع pow(2, 2)
Ø¨Ø±Ø§Û Ø§ÛÙÚ©Ù ÛÚ© ÙØ±Ø§Ø®ÙاÙÛ ØªÙØ¯Ø±ØªÙ داشت٠باشÛÙ Ø Ø¬Ø§ÙØ§Ø§Ø³Ú©Ø±Ûپت ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§Û Ú©ÙÙÙÛ Ø±Ø§ در پشت٠ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§ Ø¨Ù ÛØ§Ø¯ Ù ÛâØ³Ù¾Ø§Ø±Ø¯.
اÛÙØ¬Ø§ Ù
ا تابع Ûکسا٠pow را ÙØ±Ø§Ø®ÙاÙÛ Ù
ÛâÚ©ÙÛÙ
اÙ
ا اÛÙ Ù
ÙØ¶Ùع Ø§ØµÙØ§ Ù
ÙÙ
ÙÛØ³Øª. ÙØ±Ø§ÛÙØ¯ Ø¨Ø±Ø§Û ØªÙ
اÙ
تابعâÙØ§ Ûکسا٠است:
- ز٠ÛÙÙâÛ Ú©ÙÙÙÛ Ø¯Ø± Ø¨Ø§ÙØ§Û پشت٠«ب٠خاطر سپرد٠٠ÛâØ´ÙØ¯Â».
- ز٠ÛÙÙâÛ Ø¬Ø¯ÛØ¯ Ø¨Ø±Ø§Û Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ Ø§ÛØ¬Ø§Ø¯ Ù ÛâØ´ÙØ¯.
- ز٠اÙÛ Ú©Ù Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ ØªÙ Ø§Ù Ø´ÙØ¯Ø ز٠ÛÙÙâÛ ÙØ¨ÙÛ Ø§Ø² Ù¾Ø´ØªÙ Ø¨ÛØ±ÙÙ Ù ÛâØ¢ÛØ¯ Ù Ø§Ø¬Ø±Ø§Û Ø¢Ù Ø§Ø¯Ø§Ù Ù Ù¾ÛØ¯Ø§ Ù ÛâÚ©ÙØ¯.
زÙ
اÙÛ Ú©Ù Ù
ا ÙØ§Ø±Ø¯ Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ pow(2, 2) شدÛÙ
پشت٠زÙ
ÛÙ٠اÛÙÚ¯ÙÙÙ Ø®ÙØ§Ùد Ø¨ÙØ¯:
- Context: { x: 2, n: 2, at line 1 } pow(2, 2)
- Context: { x: 2, n: 3, at line 5 } pow(2, 3)
ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§Û Ú©ÙÙÙÛ Ø¯Ø± بخش Ø¨Ø§ÙØ§ÛÛ (٠پر رÙÚ¯) است ٠ز٠ÛÙÙâÙØ§Û ØÙظ Ø´Ø¯Ù ÙØ¯ÛÙ Û Ø¯Ø± بخش پاÛÛÙÛ ÙØ³ØªÙد.
ز٠اÙÛ Ú©Ù Ù Ø§ Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ Ø±Ø§ Ø¨Ù Ù¾Ø§ÛØ§Ù Ø±Ø³Ø§ÙØ¯ÛÙ Ø Ø§Ø¯Ø§Ù Ù Ø¯Ø§Ø¯Ù Ø²Ù ÛÙÙâÛ ÙØ¨ÙÛ Ø¢Ø³Ø§Ù Ø§Ø³Øª ÚÙÙ ÙØ± Ø¯Ù Ù ØªØºÛØ± Ù Ù ØÙ دÙÛ٠کد ک٠در Ø¢ÙØ¬Ø§ ٠تÙÙ٠شد را ØÙظ Ù ÛâÚ©ÙØ¯.
اÛÙØ¬Ø§ در تصÙÛØ± Ù
ا از Ú©ÙÙ
٠«خط(line)» Ø§Ø³ØªÙØ§Ø¯Ù کردÛÙ
ÚÙ٠در Ù
ثا٠Ù
ا ÙÙØ· ÛÚ© Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ Ø¯Ø± خط ÙØ¬Ùد دارد اÙ
ا Ø¨Ù Ø·ÙØ± Ú©ÙÛ ÛÚ© خط Ù
Ù
ک٠است ÚÙØ¯ Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ Ø±Ø§ شاÙ
Ù Ø´ÙØ¯Ø Ù
Ø«ÙØ§ pow(â¦) + pow(â¦) + somethingElse(â¦).
Ø¨ÙØ§Ø¨Ø±Ø§Û٠اÛÙک٠بگÙÛÛÙ Ù Ø³ÛØ± اجرا Â«Ø¨ÙØ§ÙاصÙ٠بعد از Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ» ادا٠٠٠ÛâÛØ§Ø¨Ø¯ دÙÛÙâØªØ± است.
تابع pow(2, 1)
ÙØ±Ø§ÛÙØ¯ تکرار Ù
ÛâØ´ÙØ¯: در خط 5 ÛÚ© Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ Ø¬Ø¯ÛØ¯ با آرگÙÙ
اÙâÙØ§Û x=2Ø n=1 Ø§ÛØ¬Ø§Ø¯ Ù
ÛâØ´ÙØ¯.
ÛÚ© ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§Û Ø¬Ø¯ÛØ¯ ساخت٠٠ÛâØ´ÙØ¯ ٠ز٠ÛÙÙâÛ ÙØ¨ÙÛ Ø¯Ø± Ø¨Ø§ÙØ§Û Ù¾Ø´ØªÙ ÙØ±Ø§Ø± Ù ÛâÚ¯ÛØ±Ø¯:
- Context: { x: 2, n: 1, at line 1 } pow(2, 1)
- Context: { x: 2, n: 2, at line 5 } pow(2, 2)
- Context: { x: 2, n: 3, at line 5 } pow(2, 3)
ØØ§Ùا 2 زÙ
ÛÙÙâÛ ÙØ¯ÛÙ
Û ÙØ¬Ùد دارد Ù ÛÚ© زÙ
ÛÙÙâÛ Ø¨Ø±Ø§Û pow(2, 1) در ØØ§Ù اجرا است.
Ø®Ø±ÙØ¬
در ØÛÙ Ø§Ø¬Ø±Ø§Û pow(2, 1) Ø¨Ø±Ø®ÙØ§Ù ÙØ¨ÙØ Ø´Ø±Ø· n == 1 truthy است پس اÙÙÛ٠شاخ٠if کار Ù
ÛâÚ©ÙØ¯:
function pow(x, n) {
if (n == 1) {
return x;
} else {
return x * pow(x, n - 1);
}
}
ÙØ±Ø§Ø®ÙاÙÛâÙØ§Û ØªÙØ¯Ø±ØªÙÛ Ø¨ÛØ´ØªØ±Û ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯ پس تابع کارش تÙ
اÙ
Ù
ÛâØ´ÙØ¯ Ù 2 را برÙ
ÛâÚ¯Ø±Ø¯Ø§ÙØ¯.
ÙÙ Ø§ÙØ·Ùر ک٠تابع Ø¨Ù Ù¾Ø§ÛØ§Ù Ù ÛâØ±Ø³Ø¯Ø Ø¯Ûگر ÙÛØ§Ø²Û ب٠ز٠ÛÙÙâÛ Ø§Ø¬Ø±Ø§Û Ø¢Ù ÙÛØ³Øª پس از ØØ§ÙØ¸Ù ØØ°Ù Ù ÛâØ´ÙØ¯. ز٠ÛÙÙâÛ ÙØ¨ÙÛ Ø§Ø² Ø¨Ø§ÙØ§Û Ù¾Ø´ØªÙ Ø¨Ø§Ø²Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ù ÛâØ´ÙØ¯:
- Context: { x: 2, n: 2, at line 5 } pow(2, 2)
- Context: { x: 2, n: 3, at line 5 } pow(2, 3)
ÙØ±Ø§ÛÙØ¯ Ø§Ø¬Ø±Ø§Û pow(2, 2) اداÙ
Ù Ù
ÛâÛØ§Ø¨Ø¯. اÛÙ ÙØ±Ø§ÛÙØ¯ Ø¯Ø§Ø±Ø§Û ÙØªÛØ¬Ù Ø²ÛØ±ÙØ±Ø§Ø®ÙØ§ÙÛ pow(2, 1) است پس Ù
ÛâØªÙØ§Ùد Ø§Ø±Ø²ÛØ§Ø¨Û x * pow(x, n - 1) را تÙ
اÙ
Ú©ÙØ¯ Ù 4 را Ø¨Ø±Ú¯Ø±Ø¯Ø§ÙØ¯.
سپس ز٠ÛÙÙâÛ ÙØ¨ÙÛ Ø¨Ø§Ø²Ú¯Ø±Ø¯Ø§ÙØ¯Ù Ù ÛâØ´ÙØ¯:
- Context: { x: 2, n: 3, at line 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: 'John',
salary: 1000
}, {
name: 'Alice',
salary: 1600
}],
development: {
sites: [{
name: 'Peter',
salary: 2000
}, {
name: 'Alex',
salary: 1800
}],
internals: [{
name: 'Jack',
salary: 1300
}]
}
};
Ø¨Ù Ø¹Ø¨Ø§Ø±ØªÛ Ø¯ÛÚ¯Ø±Ø ÛÚ© شرکت بخشâÙØ§Û Ø§Ø¯Ø§Ø±Û Ø¯Ø§Ø±Ø¯.
-
ÛÚ© بخش Ø§Ø¯Ø§Ø±Û Ù Ù Ú©Ù Ø§Ø³Øª ÛÚ© آراÛ٠از Ú©Ø§Ø±Ù ÙØ¯Ø§Ù داشت٠باشد. Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ بخش
sales(ÙØ±ÙØ´) 2 Ú©Ø§Ø±Ù ÙØ¯ دارد: John Ù Alice. -
ÛØ§ بخش Ø§Ø¯Ø§Ø±Û Ù Ù Ú©Ù Ø§Ø³Øª Ø¨Ù Ø²ÛØ±Ø¨Ø®Ø´âÙØ§ÛÛ ØªÙØ³ÛÙ Ø´ÙØ¯Ø Ù Ø«Ù
dovelopment(ØªÙØ³Ø¹Ù) ک٠د٠شاخ٠دارد:sites(Ø³Ø§ÛØªâÙØ§) Ùinternals(داخÙÛ). ÙØ± کدا٠از Ø¢ÙÙØ§ Ú©Ø§Ø±Ù ÙØ¯Ø§Ù Ø®ÙØ¯Ø´Ø§Ù را Ø¯Ø§Ø±ÙØ¯. -
ÙÙ ÚÙÛ٠٠٠ک٠است Ú©Ù ÛÚ© Ø²ÛØ±Ø¨Ø®Ø´ رشد Ú©ÙØ¯ Ù Ø¨Ù Ø²ÛØ±Ø²ÛربخشâÙØ§Û Ø§Ø¯Ø§Ø±Û (ÛØ§ تÛÙ âÙØ§) ØªÙØ³ÛÙ Ø´ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ بخش
sites٠٠ک٠است در Ø¢ÛÙØ¯Ù ب٠تÛÙ âÙØ§ÛsiteAÙsiteBØªÙØ³ÛÙ Ø´ÙØ¯. ٠آÙÙØ§Ø Ø§ØØªÙ Ø§Ù Ø¯Ø§Ø±Ø¯Ø ØØªÛ Ø¨ÛØ´ØªØ± ØªÙØ³ÛÙ Ø´ÙÙØ¯. اÛ٠در تصÙÛØ± ÙØ¬Ùد ÙØ¯Ø§Ø±Ø¯ ÙÙØ· ÚÛØ²Û است ک٠در ÙØ¸Ø± دارÛÙ .
ØØ§Ùا Ø¨ÛØ§ÛÛØ¯ بگÙÛÛ٠ک٠٠ا ÛÚ© تابع Ù ÛâØ®ÙØ§ÙÛ٠تا ج٠ع ت٠ا٠ØÙÙÙâÙØ§ را بدست Ø¨ÛØ§Ø±Ø¯. ÚÚ¯ÙÙÙ Ù ÛâØªÙØ§ÙÛ٠اÛ٠کار را Ú©ÙÛÙ Ø
ÛÚ© راÙâØÙ تکرارشÙÙØ¯Ù Ø±Ø§ØØª ÙÛØ³Øª ÚÙ٠ساختار ساد٠ÙÛØ³Øª. Ø§ÛØ¯Ù اÙÙ Ù
ÛâØªÙØ§Ùد اÛ٠باشد Ú©Ù ÛÚ© ØÙÙÙ for ÙÙ
را٠با Ø²ÛØ±ØÙÙÙâØ§Û Ø¯Ø± بخشâÙØ§Û Ø§Ø¯Ø§Ø±Û Ø³Ø·Ø Ø§ÙÙ Ø¨Ø±Ø§Û company بسازÛÙ
. اÙ
ا سپس Ù
ا Ø¨Ø±Ø§Û ØÙÙ٠زد٠در کارÙ
ÙØ¯Ø§Ù بخشâÙØ§Û Ø³Ø·Ø Ø¯ÙÙ
Ù
اÙÙØ¯ sites Ø¨Ù Ø²ÛØ±ØÙÙÙâÙØ§Û ØªÙØ¯Ø±ØªÙÛ Ø¨ÛØ´ØªØ±Û ÙÛØ§Ø² دارÛÙ
. ٠سپس ÛÚ© Ø²ÛØ±ØÙÙ٠دÛگر Ø¨Ø±Ø§Û Ø¨Ø®Ø´âÙØ§Û Ø³Ø·Ø Ø³ÙÙ
Ú©Ù Ù
Ù
ک٠است در Ø¢ÛÙØ¯Ù ÙÙ
Ø§ÛØ§Ù Ø´ÙÙØ¯Ø اگر Ù
ا 3 ÛØ§ 4 Ø²ÛØ±ØÙÙ٠درÙ٠کد بگذارÛÙ
تا در ÛÚ© Ø´ÛØ¡ Ù¾ÛÙ
Ø§ÛØ´ Ú©ÙÛÙ
Ø Ú©Ø¯ ÙØ³Ø¨ØªØ§ زشت Ù
ÛâØ´ÙØ¯.
Ø¨ÛØ§ÛÛØ¯ بازگشت را Ø§Ù ØªØØ§Ù Ú©ÙÛÙ .
ÙÙ Ø§ÙØ·Ùر Ú©Ù Ù ÛâØ¨ÛÙÛÙ Ø Ø²Ù Ø§ÙÛ Ú©Ù ØªØ§Ø¨Ø¹ ٠ا ÛÚ© بخش Ø§Ø¯Ø§Ø±Û Ø¨Ø±Ø§Û Ø¬Ù Ø¹ Ø²Ø¯Ù Ø¯Ø§Ø±Ø¯Ø 2 ØØ§Ùت Ø§ØØªÙ اÙÛ ÙØ¬Ùد دارد:
- ÛØ§ ÛÚ© بخش «سادÙ» با آراÛÙâØ§Û Ø§Ø² اشخاص است ک٠در اÛÙ ØµÙØ±Øª Ù ÛâØªÙØ§ÙÛ٠در ÛÚ© ØÙÙ٠ساد٠ØÙÙÙâÙØ§ را ج٠ع بزÙÛÙ .
- ÛØ§ ÛÚ© Ø´ÛØ¡ ÛØ§
NØ²ÛØ±Ø¨Ø®Ø´ است ک٠در اÛÙ ØµÙØ±Øª Ù ÛâØªÙØ§ÙÛÙNÙØ±Ø§Ø®ÙاÙÛ Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ø¨Ø³Ø§Ø²Û٠تا Ù Ø¬Ù ÙØ¹ را Ø¨Ø±Ø§Û ÙØ± کدا٠از Ø²ÛØ±Ø¨Ø®Ø´âÙØ§ بدست Ø¨ÛØ§Ø±ÛÙ Ù ÙØªÛجÙâÙØ§ را ادغا٠کÙÛÙ .
Ù ÙØ±Ø¯ اÙ٠پاÛ٠بازگشت Ø§Ø³ØªØ Ù ÙØ±Ø¯ ÙØ§Ø¶Ø ٠بدÛÙÛØ ز٠اÙÛ Ú©Ù Ù Ø§ ÛÚ© آراÛ٠دارÛÙ .
Ù ÙØ±Ø¯ دÙÙ Ø Ø²Ù Ø§ÙÛ Ú©Ù Ù Ø§ ÛÚ© Ø´ÛØ¡ دارÛÙ Ø Ù Ø±ØÙÙ Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ø§Ø³Øª. ÛÚ© کار Ù¾ÛÚÛØ¯Ù ب٠ÚÙØ¯ کار Ø±ÛØ² Ø¨Ø±Ø§Û Ø¨Ø®Ø´âÙØ§Û Ú©ÙÚکتر ØªÙØ³Û٠شد٠است. Ø¢ÙÙØ§ ٠٠ک٠است Ø¯ÙØ¨Ø§Ø±Ù ØªÙØ³ÛÙ Ø´ÙÙØ¯ ا٠ا Ø¯ÛØ± ÛØ§ Ø²ÙØ¯ ØªÙØ³Û٠شد٠در (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 (Ú©Ù Ø®ÙØ¯Ø´Ø§Ù ٠٠ک٠است Ø´Ø§Ù Ù ÙØ³Ù تâÙØ§Û ٠تÙÛ/Ú©Ø§Ù ÙØªâÙØ§ ÛØ§ Ø¨Ø±ÚØ³Ø¨âÙØ§Û دÛگر Ø¨Ø§Ø´ÙØ¯).
اÛÙ ÙÙ ÛÚ© تعرÛÙ Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ø§Ø³Øª.
Ø¨Ø±Ø§Û Ø¯Ø±Ú© Ø¨ÙØªØ±Ø ٠ا ÛÚ© ساختار Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ø¯Ûگر Ø¨Ù ÙØ§Ù «ÙÛØ³Øª Ù¾ÛÙÙØ¯Û (Linked list)» ک٠٠٠ک٠است در Ø¨Ø¹Ø¶Û Ù ÙØ§Ø±Ø¯ جاÛگزÛÙÛ Ø¨Ø±Ø§Û Ø¢Ø±Ø§ÛÙâÙØ§ Ø¨Ø§Ø´ÙØ¯ را Ù¾ÙØ´Ø´ Ù ÛâØ¯ÙÛÙ .
ÙÛØ³Øª Ù¾ÛÙÙØ¯Û
ØªØµÙØ± Ú©ÙÛØ¯Ø ٠ا Ù ÛâØ®ÙØ§ÙÛÙ ÛÚ© ÙÛØ³Øª ٠رتب از Ø´ÛØ¡Ùا را Ø°Ø®ÛØ±Ù Ú©ÙÛÙ .
Ø§ÙØªØ®Ø§Ø¨ Ø·Ø¨ÛØ¹Û Ù ÛâØªÙØ§Ùد آراÛ٠باشد:
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] ÛÚ© Ø±Ø¬ÙØ¹ Ù
ستÙÛÙ
است. اÙ
ا در ÙÛØ³Øª Ù
ا Ø¨Ø§ÛØ¯ از اÙÙÛ٠اÙÙ
Ø§Ù Ø´Ø±ÙØ¹ Ú©ÙÛÙ
٠ب٠تعداد N بار ب٠next برÙÛÙ
تا ب٠اÙÙ
ا٠NاÙÙ
برسÛÙ
.
â¦Ø§Ù ا ÙÙ ÛØ´Ù ب٠ÚÙÛÙ Ú©Ø§Ø±ÙØ§ÛÛ ÙÛØ§Ø² ÙØ¯Ø§Ø±ÛÙ . Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ ز٠اÙÛ Ú©Ù Ù Ø§ ب٠ÛÚ© ØµÙ ÛØ§ ØØªÛ ÛÚ© ØµÙ Ø¯ÙØ·Ø±ÙÙ ÙÛØ§Ø² دارÛÙ Ø Ø³Ø§Ø®ØªØ§Ø±Û Ú©Ù Ø¨Ø§ÛØ¯ اضاÙÙ/ØØ°Ù Ú©Ø±Ø¯Ù Ø³Ø±ÛØ¹ را از ÙØ± Ø¯Ù Ø§ÙØªÙا ٠٠ک٠سازد ا٠ا Ø¯Ø³ØªØ±Ø³Û Ø¨Ù ÙØ³Ø· Ø¢Ù ÙÛØ§Ø² ÙÛØ³Øª.
ÙÛØ³ØªâÙØ§ Ù ÛâØªÙØ§ÙÙØ¯ Ù¾ÛØ´Ø±Ùت Ú©ÙÙØ¯:
- Ù
ا Ù
ÛâØªÙØ§ÙÛÙ
ÙÛÚÚ¯Û
prevرا در Ú©ÙØ§Ø±nextاضاÙÙ Ú©ÙÛ٠تا ب٠اÙÙ Ø§Ù ÙØ¨ÙÛ Ø±Ø¬ÙØ¹ Ú©ÙÛÙ Ù Ø¨Ù Ø±Ø§ØØªÛ Ø¨Ù Ø¹ÙØ¨ برگردÛÙ . - ÙÙ
ÚÙÛÙ Ù
ÛâØªÙØ§ÙÛÙ
ÛÚ© Ù
ØªØºÛØ± Ø¨Ù ÙØ§Ù
tailک٠ب٠اÙ٠ا٠آخر ÙÛØ³Øª Ø±Ø¬ÙØ¹ Ù ÛâÚ©ÙØ¯ اضاÙÙ Ú©ÙÛÙ (Ù ÙØ± ز٠ا٠ک٠اÙ٠اÙÛ Ø§Ø¶Ø§ÙÙ/ØØ°Ù Ù ÛâÚ©ÙÛ٠آ٠را Ø§Ù¾Ø¯ÛØª Ú©ÙÛÙ ). - â¦Ø³Ø§Ø®ØªØ§Ø± داد٠٠ÛâØªÙØ§Ùد با ØªÙØ¬Ù ب٠ÙÛØ§Ø²ÙØ§Û Ù Ø§ Ø®ÛÙÛ ØªÙÙØ¹ داشت٠باشد.
Ø®ÙØ§ØµÙ
Ø§ØµØ·ÙØ§ØØ§Øª:
-
بازگشت ÛÚ© عبارت Ø¨Ø±ÙØ§Ù ÙâÙÙÛØ³Û ٠ب٠٠عÙÛ ÙØ±Ø§Ø®ÙاÙÛ ÛÚ© تابع در Ø®ÙØ¯Ø´ است. تابعâÙØ§Û Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ù ÛâØªÙØ§ÙÙØ¯ Ø¨Ø±Ø§Û ØÙ کرد٠٠سائ٠با راÙâÙØ§ÛÛ Ø¹Ø§ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ø´ÙÙØ¯.
ز٠اÙÛ Ú©Ù ÛÚ© تابع Ø®ÙØ¯Ø´ را ÙØ±Ø§Ø®ÙاÙÛ Ù ÛâÚ©ÙØ¯Ø ب٠آ٠٠رØÙ٠بازگشت Ù ÛâÚ¯ÙÛÙØ¯. اساس Ø¨Ø§Ø²Ú¯Ø´ØªØ Ø¢Ø±Ú¯Ù٠اÙâÙØ§Û تابع ÙØ³ØªÙد ک٠کار را اÙÙØ¯Ø± ساد٠٠ÛâÚ©ÙÙØ¯ ک٠تابع دÛگر ÙØ±Ø§Ø®ÙاÙÛâÙØ§Û Ø¨ÛØ´ØªØ±Û Ø§ÙØ¬Ø§Ù ÙÙ ÛâØ¯ÙØ¯.
-
ÛÚ© ساختار Ø¯Ø§Ø¯Ù Ú©Ù Ø¨Ù ØµÙØ±Øª Ø¨Ø§Ø²Ú¯Ø´ØªÛ ØªØ¹Ø±Û٠شد٠باشد ساختار دادÙâØ§Û Ø§Ø³Øª Ú©Ù Ù ÛâØªÙØ§Ùد با Ø§Ø³ØªÙØ§Ø¯Ù از Ø®ÙØ¯Ø´ تعرÛÙ Ø´ÙØ¯.
Ø¨Ø±Ø§Û Ù Ø«Ø§ÙØ ÙÛØ³Øª Ù¾ÛÙÙØ¯Û Ù ÛâØªÙØ§Ùد ب٠عÙÙØ§Ù ساختار دادÙâØ§Û ØªØ¹Ø±ÛÙ Ø´ÙØ¯ Ú©Ù Ø´ÛØ¡Ø§Û Ø±Ø¬ÙØ¹âÚ©ÙÙØ¯Ù ب٠ÛÚ© ÙÛØ³Øª (ÛØ§ ÙÛÚÛ) را Ø´Ø§Ù Ù Ø´ÙØ¯.
list = { value, next -> list }درختâÙØ§ ٠اÙÙØ¯ اÙ٠اÙâÙØ§Û HTML ÛØ§ درخت بخش Ø§Ø¯Ø§Ø±Û Ø¯Ø± اÛÙ ÙØµÙ ÙÙ Ø¨Ù Ø·ÙØ± Ø·Ø¨ÛØ¹Û Ø¨Ø§Ø²Ú¯Ø´ØªÛ ÙØ³ØªÙد: Ø¢ÙÙØ§ شاخÙââÙØ§ÛÛ Ø¯Ø§Ø±ÙØ¯ Ù ÙØ± شاخ٠٠ÛâØªÙØ§Ùد شاخÙâÙØ§Û دÛگر Ù٠داشت٠باشد.
ÙÙ Ø§ÙØ·Ùر ک٠در ٠ثاÙ
sumSalaryØ¯ÛØ¯Û٠تابعâÙØ§Û Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ù ÛâØªÙØ§ÙÙØ¯ Ø¨Ø±Ø§Û Ù¾ÛÙ Ø§ÛØ´ درÙ٠آÙÙØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ø´ÙÙØ¯.
ÙØ± تابع Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ù ÛâØªÙØ§Ùد Ø¨Ù ØµÙØ±Øª تکرارشÙÙØ¯Ù بازÙÙÛØ³Û Ø´ÙØ¯. ٠گاÙÛ Ø§ÙÙØ§Øª Ø¨Ø±Ø§Û Ø¨ÙÛÙ٠کرد٠ب٠آ٠ÙÛØ§Ø² است. ا٠ا Ø¨Ø±Ø§Û Ø¨Ø³ÛØ§Ø±Û از Ú©Ø§Ø±ÙØ§ راÙâØÙ Ø¨Ø§Ø²Ú¯Ø´ØªÛ Ø¨Ù Ø§ÙØ¯Ø§Ø²Ù کاÙÛ Ø³Ø±ÛØ¹ Ù Ø¨Ø±Ø§Û ÙÙØ´ØªÙ Ù Ù¾Ø´ØªÛØ¨Ø§ÙÛ Ú©Ø±Ø¯Ù Ø±Ø§ØØªâتر است.
ÙØ¸Ø±Ø§Øª
<code>Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯Ø Ø¨Ø±Ø§Û ÚÙØ¯Û٠خط â کد را درÙ٠تگ<pre>ÙØ±Ø§Ø± دÙÛØ¯Ø Ø¨Ø±Ø§Û Ø¨ÛØ´ از د٠خط کد â Ø§Ø² ÛÚ© جعبÙÙ Ø´ÙÛ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯. (plnkrØ jsbinØ codepenâ¦)