ããã§ã¯é¢æ°ã«æ»ããããæ·±ãå¦ã³ã¾ãããã
æåã®ãããã¯ã¯ å帰 ã§ãã
ããªããããã°ã©ãã³ã°åå¿è ã§ãªããªãããããã馴æã¿ã®ããå 容ãªã®ã§ãã®ãã£ãã¿ã¼ãã¹ããããã¦ãåé¡ããã¾ããã
å帰ã¯ãã¿ã¹ã¯ãåã種é¡ã®è¤æ°ã®ã¿ã¹ã¯ã«åå²ãããã¨ãã§ããç¶æ³ã§å½¹ç«ã¤ããã°ã©ãã³ã°ãã¿ã¼ã³ã§ãããã·ã³ãã«ã«å®ç¾ãããã¨ãã§ãã¾ãããããã¯ãã¿ã¹ã¯ãç°¡åãªã¢ã¯ã·ã§ã³ã¨åãã¿ã¹ã¯ã®ããã·ã³ãã«ãªãã¿ã¼ã³ã«åç´åã§ããå ´åãããã®å¾ããã«è¦ã¦ããã¾ããç¹å®ã®ãã¼ã¿æ§é ãæ±ãå ´åã«ãå½¹ç«ã¡ã¾ãã
颿°ãã¿ã¹ã¯ã解決ããã¨ããå¦çã®éç¨ã§å¤ãã®ä»ã®é¢æ°ãå¼ã¶ãã¨ãã§ãã¾ãããã®é¨åçãªã±ã¼ã¹ã¨ãã¦ã颿°ã èªåèªèº« ãå¼ã¶ã¨ãã§ãããã㯠å帰 ã¨å¼ã°ãã¾ãã
2ã¤ã®èãæ¹
åãã®ã·ã³ãã«ãªä¾ã¨ãã¦ãx ã® n ä¹ããã颿° pow(x, n) ãæ¸ãã¦ã¿ã¾ããããã¤ã¾ããx èªèº«ã n åä¹ç®ãã¾ãã
pow(2, 2) = 4
pow(2, 3) = 8
pow(2, 4) = 16
2ã¤ã®å®è£ æ¹æ³ãããã¾ãã
-
å復çãªèãæ¹:
forã«ã¼ã:function pow(x, n) { let result = 1; // ã«ã¼ãã§ãn åçµæã x ã§ä¹ç®ãã 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) ãå¼ã°ããã¨ãããã®å®è¡ã¯2ã¤ã®åå²ã«åããã¾ãã:
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ã®ä¹ç®)ã¨ãåãã¿ã¹ã¯ã®å¼ã³åºã(ããå°ããnã§ã®pow)ã«å¤æãã¾ããæ¬¡ã®ã¹ãããã§ã¯ãããããã«åç´åãã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
ãããã£ã¦ãå帰ã¯é¢æ°å¼ã³åºããããç°¡åãªãã®ã«å¤æãããããçµæãæç½ã«ãªãã¾ã§ç¹°ãè¿ãã¾ãã
å帰çãªè§£æ±ºçã¯ãé常ãå復ããæ¹æ³ãããçãã§ãã
ããã§ãpow(x, n) ãããç°¡æ½ã«ãããã¤èªã¿ãããããããã« if ã®ä»£ããã«3é
æ¼ç®å ? ã使ã£ã¦æ¸ãç´ããã¨ãã§ãã¾ãã:
function pow(x, n) {
return (n == 1) ? x : (x * pow(x, n - 1));
}
å
¥ãåå¼ã³åºãã®æå¤§æ°(æåã®1åãå«ã)㯠åå¸°ã®æ·±ããã¨å¼ã°ãã¾ããæã
ã®ã±ã¼ã¹ã§ã¯ããã㯠n ã«ãªãã¾ãã
æå¤§ã®åå¸°ã®æ·±ã㯠JavaScript ã¨ã³ã¸ã³ã«ãã£ã¦å¶éããã¦ãã¾ãã10,000 ã¯ç¢ºå®ã§ãã¨ã³ã¸ã³ã«ãã£ã¦ã¯ããå¤ãã®å¤ãå¯è½ã§ããã100,000 ã¯æãã大夿°ã®å¶éãè¶ ãã¾ãããããç·©åããèªåæé©ãããã¾ã(âæ«å°¾å帰â)ããã©ãã§ããµãã¼ãããã¦ããããã§ã¯ãªããåç´ãªã±ã¼ã¹ã§ã®ã¿æ©è½ãã¾ãã
ããã¯å帰ã®ä½¿ç¨ãå¶éãã¾ãããä¾ç¶ã¨ãã¦é常ã«åºç¯å²ã«ä½¿ããã¦ãã¾ããå帰çãªèãæ¹ã§ã³ã¼ããã·ã³ãã«ã«ãªããä¿å®ã容æã«ãªãã¿ã¹ã¯ã¯ããããããã¾ãã
å®è¡ã³ã³ããã¹ãã¨ã¹ã¿ãã¯
ãã¦ãã©ã®ããã«å帰å¼ã³åºããåä½ãããæ¤è¨¼ãã¦ã¿ã¾ãããããã®ããã«ã¯é¢æ°ã®å é¨ãè¦ã¦ããã¾ãã
颿°ã®å®è¡ã«é¢ããæ å ±ã¯ããã® å®è¡ã³ã³ããã¹ã ã«æ ¼ç´ããã¦ãã¾ãã
å®è¡ã³ã³ããã¹ã(execution context) ã¯é¢æ°ã®å®è¡ã«é¢ãã詳細ãå«ãå
é¨ã®ãã¼ã¿æ§é ã§ãã: ä»ã¯ã©ã®å¶å¾¡ããã¼ã§ããããç¾å¨ã®å¤æ°ãthis ã®å¤(ããã§ã¯ä½¿ãã¾ããã)ãããã®ä»ããã¤ãã®å
é¨ãã¼ã¿ãæã¡ã¾ãã
1ã¤ã®é¢æ°å¼ã³åºãã«ã¯ãããã«é¢é£ä»ããããå®è¡ã³ã³ããã¹ãã1ã¤ã ãããã¾ãã
颿°ããã¹ãå¼ã³åºããããå ´åãæ¬¡ã®ãããªãã¨ãèµ·ããã¾ã:
- ç¾å¨ã®é¢æ°ã䏿忢ãã¾ãã
- ç¾å¨ã®é¢æ°ã«é¢é£ä»ãããã¦ããå®è¡ã³ã³ããã¹ãã¯ã å®è¡ã³ã³ããã¹ãã¹ã¿ã㯠ã¨å¼ã°ããç¹å¥ãªãã¼ã¿æ§é ã§è¨é²ããã¾ãã
- ãã¹ãå¼ã³åºããå®è¡ãã¾ãã
- ãããçµããã¨ãã¹ã¿ãã¯ããå¤ãå®è¡ã³ã³ããã¹ããåãåºããã忢ããæããå¤é¨ã®é¢æ°ãåéããã¾ãã
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 㯠false ãªã®ã§ãããã¼ã¯ if ã®2ã¤ç®ã®åå²(else)ã«ç¶ãã¾ã:
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(2, 2) ã§ã® pow ã®ãµãã³ã¼ã«ãä½ãå¿
è¦ãããã¾ãã
pow(2, 2)
ãã¹ããããå¼ã³åºãããããããJavaScript 㯠å®è¡ã³ã³ããã¹ãã¹ã¿ã㯠ã«ç¾å¨ã®å®è¡ã³ã³ããã¹ããè¨æ¶ãã¾ãã
ããã§ãåã颿° 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)â ã¨ããè¨èã使ãã¾ããããé常1è¡ã®ã³ã¼ãã«ã¯ 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) ãå®è¡ä¸ã®1ã¤ã®ã³ã³ããã¹ããããã¾ãã
The exit
pow(2, 1) ã®å®è¡ã¯ãããã¾ã§ã¨ã¯ç°ãªãæ¡ä»¶ n == 1 ãçã«ãªãã¾ããå¾ã£ã¦ 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 ããå°ãããã¹ã¦ã®å¤ã«å¯¾ãã¦ãã³ã³ããã¹ãã®ããã®ã¡ã¢ãªãå¿
è¦ã§ãã
䏿¹ãã«ã¼ããã¼ã¹ã®ã¢ã«ã´ãªãºã ã¯ã¡ã¢ãªãç¯ç´ãã¾ã:
function pow(x, n) {
let result = 1;
for (let i = 0; i < n; i++) {
result *= x;
}
return result;
}
å復ç㪠pow ã¯å¦çã®ä¸ã§ã i 㨠result ãå¤åãã1ã¤ã®ã³ã³ããã¹ãã使ãã¾ãããã®ã¡ã¢ãªè¦ä»¶ã¯å°ãããåºå®ã§ 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é¨éã¯ï¼äººã®å¾æ¥å¡ããã¾ããJohn 㨠Alice ã§ãã -
ãããã¯ã
developmentã¯ï¼ã¤ã®æ(sitesã¨internals)ãæã£ã¦ããããã«ãé¨ç½²ã¯ãµãã®é¨ç½²ã«åå²ãããããããã¾ããããããã¯åã ã®ã¹ã¿ãããæã¡ã¾ãã -
ãµãã®é¨ç½²ãæé·ããã¨ãããµãã®ããã«ãµãé¨ç½² (ã¾ãã¯ãã¼ã ) ã«åå²ãããå¯è½æ§ãããã¾ãã
ä¾ãã°ãå°æ¥
sitesé¨éãsiteAã¨siteBã®ãã¼ã ã«åå²ãããããããã¾ãããããã¦ãããã¯æ½å¨çã«ããã«åå²ãããã¨ãã§ãã¾ãã
ã§ã¯ãå ¨å¡ã®çµ¦æã®åè¨ãåå¾ãã颿°ã欲ããã¨ãã¾ããããã©ã®ããã«ããã°ããã§ãããï¼
å復çãªã¢ããã¼ãã¯ç°¡åã§ã¯ããã¾ããããªããªãæ§é ã¯ã·ã³ãã«ã§ã¯ãªãããã§ããæåã®ã¢ã¤ãã¢ã¯ã第1ã¬ãã«ã®æå±ã®ãã¹ãããããµãã«ã¼ããã㤠company ã« for ãã«ã¼ããä½ããã¨ã§ããããããæ¬¡ã« sites ã®ãã㪠第2ã¬ãã«ã®é¨éã®ã¹ã¿ãããå復ããããã«ã¯ãããå¤ãã®ãã¹ãããããµãã«ã¼ããå¿
è¦ã«ãªãã¾ããâ¦ããã¦ãå°æ¥ç¾ãããããããªã第ï¼ã¬ãã«ã®é¨éã®ããã®å¥ã®ãµãã«ã¼ããå¿
è¦ã§ããï¼ã¾ãã¬ãã«3ã§åæ¢ããããã¬ãã«4ã®ã«ã¼ãã使ããå¿
è¦ãããã¾ããï¼ 1ã¤ã®ãªãã¸ã§ã¯ããæ¢ç´¢ããããã«3ã4åã®ãã¹ãããããµãã«ã¼ããã³ã¼ãå
ã«ç½®ãã¨ãããã¯ããªãéããã®ã«ãªãã¾ãã
å帰ã§ãã©ã¤ãã¦ã¿ã¾ãããã
ä¸ããåããããã«ã颿°ãåè¨ããããã®é¨ç½²ãåå¾ããã¨ãã2ã¤ã®ã±ã¼ã¹ãããã¾ã:
- 人ã®é å ãæã¤ âã·ã³ãã«ãªâ é¨ç½²ã®å ´åã§ãããã®å ´åã¯åç´ãªã«ã¼ãã§çµ¦æãåè¨ãããã¨ãã§ãã¾ãã
- ãããã¯
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)) { // case (1)
return department.reduce((prev, current) => prev + current.salary, 0); // é
åã®åè¨
} else { // case (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ã¯å¤ã®é åãè¿ãã¾ãã
å帰æ§é
å帰(å帰çã«å®ç¾©ããã)ãã¼ã¿æ§é ã¯ãããèªèº«ãé¨åçã«è¤è£½ããæ§é ã§ãã
ç§ãã¡ã¯ãä¸ã®ä¼ç¤¾æ§é ã®ä¾ã§ã¡ããã©ãããè¦ã¾ããã
ä¼ç¤¾ã® é¨ç½² ã¯:
- 人ã®é å
- ããã㯠é¨ç½² ãæã¤ãªãã¸ã§ã¯ã
webéçºè ã«ã¨ã£ã¦ã¯ããã£ã¨ããç¥ããã¦ããä¾ãããã¾ã: HTMLãXMLããã¥ã¡ã³ãã§ãã
HTMLããã¥ã¡ã³ãã§ã¯ãHTMLã¿ã° ã«ã¯æ¬¡ã®ä¸è¦§ãå«ã¾ãã¦ãã¾ã:
- ããã¹ãé¨å
- HTML ã³ã¡ã³ã
- ä»ã® HTMLã¿ã° (ããã«ã¯ããã¹ãé¨å/ã³ã¡ã³ããä»ã®ã¿ã°ãªã©ãå«ã¾ãã¦ãã¾ã)
ããã¯ç¹°ãè¿ãã«ãªãã¾ãããå帰çãªå®ç¾©ã§ãã
ããæ·±ãçè§£ã®ããã«ã ãã1ã¤ãããã¤ãã®ã±ã¼ã¹ã§ã¯é åã®ä»£ããã®ããè¯ã鏿è¢ãããããªã âé£çµãªã¹ãâ ã¨å¼ã°ããå帰æ§é ãå¦ã³ã¾ãããã
é£çµãªã¹ã(Linked list)
æ³åãã¦ãã ãããæã ãé åºä»ãããããªãã¸ã§ã¯ãã®ãªã¹ããä¿åãããã¨ãã¾ãã
èªç¶ãªé¸æè¢ã¯é åã§ã:
let arr = [obj1, obj2, obj3];
â¦ããããé
åã使ãå ´åã«ã¯åé¡ãããã¾ãã âè¦ç´ ã®åé¤â 㨠âè¦ç´ ã®æ¿å
¥â æä½ã¯ã³ã¹ããé«ãã§ããä¾ãã° arr.unshift(obj) æä½ã¯æ°ãã obj ã®ããã®å ´æãä½ãããã«ãå
¨ã¦ã®è¦ç´ ã®çªå·ãæ¯ãç´ãå¿
è¦ãããã¾ããã¾ããããé
åã大ããå ´åãããã¯æéããããã¾ããarr.shift() ãåãã§ãã
大éã®çªå·ã®åå²å½ã¦ãå¿
è¦ã¨ããªãå¯ä¸ã®æ§é 夿´ã¯é
åã®æ«å°¾ã¸ã®æä½ã§ã: arr.push/popãå¾ã£ã¦ãé
åã¯å¤§ããªãã¥ã¼ã«å¯¾ãã¦ã¯é常ã«é
ããªãå¯è½æ§ãããã¾ãã
ãããã¯ããããæ¬å½ã«éãæ¿å ¥/åé¤ãå¿ è¦ã§ããã°ãé£çµãªã¹ã(linked list) ã¨å¼ã°ããå¥ã®ãã¼ã¿æ§é ã鏿ãããã¨ãã§ãã¾ãã
é£çµãªã¹ãè¦ç´ ã¯æ¬¡ã®è¦ç´ ããã¤ãªãã¸ã§ã¯ãã¨ãã¦ãå帰çã«å®ç¾©ããã¾ã:
value.- 次㮠é£çµãªã¹ãè¦ç´ ã¾ãã¯æ«å°¾ã®å ´åã¯
nullãåç §ããnextããããã£ã
ä¾:
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åç®ã®è¦ç´ ãåå¾ããããã«ãN å next ãè¡ãå¿
è¦ãããã¾ãã
â¦ã§ãã常ã«ãã®ãããªæä½ãå¿ è¦ã¨ã¯éãã¾ãããä¾ãã°ããã¥ã¼(queue)ã ããã¯(deque) ãå¿ è¦ãªã¨ãã§ãããããã¯ä¸¡ç«¯ããè¦ç´ ãé常ã«é«éã«è¿½å /åé¤ã§ããé åºä»ããããæ§é ã§ãã
ãªã¹ãã¯æ¡å¼µã§ãã¾ã:
nextã«å ãã¦prevããããã£ãä»ãå ãããã¨ã§ãåã®è¦ç´ ãåç §ããããã«ç°¡åã«æ»ããããã«ãããã¨ãã§ãã¾ãã- ãªã¹ãã®æå¾ã®è¦ç´ ãåç
§ãã
tailã¨å¼ã°ãã夿°ã追å ãããã¨ãã§ãã¾ãï¼æ«å°¾ããè¦ç´ ã追å ï¼åé¤ããã¨ãã«æ´æ°ãã¾ãï¼ã - â¦ãã¼ã¿æ§é ã¯ãã¼ãºã«å¿ãã¦ç°ãªãã¾ãã
ãµããª
ç¨èª:
-
å帰 㯠âèªå·±å¼ã³åºãâ 颿°ãæå³ããããã°ã©ãã³ã°ã®ç¨èªã§ãããã®ãããªé¢æ°ã使ç¨ãã¦ãç¹å®ã®ã¿ã¹ã¯ãç°¡æ½ã§ç¾ããæ¹æ³ã§è§£æ±ºãããã¨ãã§ãã¾ãã
颿°ãèªèº«ãå¼ã³åºãã¨ãããã㯠å帰ã¹ããã ã¨å¼ã°ãã¾ãã å帰㮠åºåº ã¯ã颿°ããã以ä¸ã®å¼ã³åºããè¡ããªãããã«ã¿ã¹ã¯ãåç´åãã颿°ã®å¼æ°ã§ãã
-
å帰çãªå®ç¾©(recursively-defined) ãã¼ã¿æ§é ã¯èªèº«ã使ã£ã¦å®ç¾©ã§ãããã¼ã¿æ§é ã§ãã
ä¾ãã°ãé£çµãªã¹ã(linked list) ã¯ãªã¹ã(ã¾ã㯠null)ãåç §ãããªãã¸ã§ã¯ãã§æ§æããã¦ãããã¼ã¿æ§é ã¨ãã¦å®ç¾©ã§ãã¾ãã
list = { value, next -> list }ãã®ãã£ãã¿ã¼ã«ãã£ãHTMLè¦ç´ ãé¨ç½²ã®ãããªããªã¼ãã¾ãããã¡ããå帰çã§ã: ãããã¯åå²ããååå²ã¯å¥ã®åå²ããã¤ãã¨ãã§ãã¾ãã
sumSalaryã®ä¾ã§è¦ãããã«ãå台颿°ã使ã£ã¦ããããè¦ã¦åããã¨ãã§ãã¾ãã
ã©ããªå台颿°ãå復çãªãã®ã«æ¸ãç´ããã¨ãã§ãã¾ããããã¦ãæã«ã¯æé©åãè¡ãå¿ è¦ãããã¾ããããããå¤ãã®ã¿ã¹ã¯ã§ã¯ãå帰çãªè§£æ±ºçã¯ååéããæ¸ãããããä¿å®ãç°¡åã§ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã