Ivan Grinkin před 8 roky
rodič
revize
59b81b439f
1 změnil soubory, kde provedl 110 přidání a 3 odebrání
  1. 110 3
      07ObjectsFunctionalStyle.md

+ 110 - 3
07ObjectsFunctionalStyle.md

@@ -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);
 ```