|
@@ -217,7 +217,7 @@ var person = new Person("Ivan", "Petroff")
|
|
|
alert(person.getFullName())
|
|
|
```
|
|
|
|
|
|
-Альтернативой этому решению является *сохранение* this в замыкании:
|
|
|
+Альтернативой этому решению является *сохранение* `this` в замыкании:
|
|
|
|
|
|
|
|
|
```javascript
|
|
@@ -298,8 +298,115 @@ someArray.min()
|
|
|
|
|
|
Array.prototype.min = function(){
|
|
|
return Math.min.apply(Math, this)
|
|
|
-}
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
|
|
|
[100, 500, -100500].min()
|
|
|
-["a", "b", "Z"].min()
|
|
|
+```
|
|
|
+
|
|
|
+## Рекурсия
|
|
|
+
|
|
|
+Рекурсия - это прямой или косвенный самовызов функции. Обычно применяется для обработки деревьев в структурах данных или иных вложенностей.
|
|
|
+Например **факториал** (`!`) - произведение всех чисел от `0` до `N` можно определить как:
|
|
|
+
|
|
|
+N ! = 1 x 2 x 3 x 4 x .... x N,
|
|
|
+
|
|
|
+или рекурсивно:
|
|
|
+
|
|
|
+N ! = N x (N - 1) !
|
|
|
+
|
|
|
+
|
|
|
+```javascript
|
|
|
+function factorial(N){
|
|
|
+ if (N <= 1){
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ return N * factorial(N -1);
|
|
|
+}
|
|
|
+
|
|
|
+factorial ( 5 ); // это 5 * factorial(4), что, в свою очередь, будет 4 * factorial(3) и так далее
|
|
|
+```
|
|
|
+
|
|
|
+### Деревья
|
|
|
+
|
|
|
+Рекурсия удобна для обработки вложенностей.
|
|
|
+
|
|
|
+
|
|
|
+```javascript
|
|
|
+var tree =
|
|
|
+{
|
|
|
+ name: "root",
|
|
|
+ nested: [
|
|
|
+ {
|
|
|
+ name: "0",
|
|
|
+ nested: [
|
|
|
+ {
|
|
|
+ name: "00",
|
|
|
+ nested: [
|
|
|
+ {
|
|
|
+ name: "000",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "010",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "020",
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "01",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "02",
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "1",
|
|
|
+ nested: [
|
|
|
+ {
|
|
|
+ name: "10",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "11",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "12",
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "2",
|
|
|
+ nested: [
|
|
|
+ {
|
|
|
+ name: "20",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "21",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "22",
|
|
|
+ },
|
|
|
+ ]
|
|
|
+ },
|
|
|
+ ]
|
|
|
+}
|
|
|
+
|
|
|
+function walker(node, nestedFieldName, deepness, callback){
|
|
|
+ callback(node, nestedFieldName, deepness);
|
|
|
+ if (nestedFieldName in node){
|
|
|
+ for (key in node[nestedFieldName]){
|
|
|
+ walker(node[nestedFieldName][key], nestedFieldName, deepness +1, callback)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+var str = "";
|
|
|
+walker(tree, "nested", 0, function(node, nestedFieldName, deepness){
|
|
|
+ str += " ".repeat(deepness) + node.name + "\n";
|
|
|
+});
|
|
|
+
|
|
|
+console.log(str);
|
|
|
```
|