Помогите разобраться c примером из книги по JavaScript

251
28 января 2018, 04:28

Можете описать как работает эта функция по-порядку? Меня этот пример прям в ступор ввел. Мне бы прям по-порядку, как что куда передается, что вызывается, что и куда после этого возвращается и тд. Простым языком и шаг за шагом. Понятно, что тут рекурсия, но хотя бы сам принцип... до конца не нужно все перебрать в тексте разумеется:) Не хочу дальше двигаться, пока не пойму этот пример, а обратиться не к кому. Чтоб вы понимали что тут происходит вообще, то тут как бы высчитывается процент ДНК, который есть у автора от его самого дальнего родственника:)

var ANCESTRY_FILE = JSON.stringify([ 
  {"name": "Carolus Haverbeke", "sex": "m", "born": 1832, "died": 1905, "father": "Carel Haverbeke", "mother": "Maria van Brussel"}, 
  {"name": "Emma de Milliano", "sex": "f", "born": 1876, "died": 1956, "father": "Petrus de Milliano", "mother": "Sophia van Damme"}, 
  {"name": "Maria de Rycke", "sex": "f", "born": 1683, "died": 1724, "father": "Frederik de Rycke", "mother": "Laurentia van Vlaenderen"}, 
  {"name": "Jan van Brussel", "sex": "m", "born": 1714, "died": 1748, "father": "Jacobus van Brussel", "mother": "Joanna van Rooten"}, 
  {"name": "Philibert Haverbeke", "sex": "m", "born": 1907, "died": 1997, "father": "Emile Haverbeke", "mother": "Emma de Milliano"}, 
  {"name": "Jan Frans van Brussel", "sex": "m", "born": 1761, "died": 1833, "father": "Jacobus Bernardus van Brussel", "mother":null}, 
  {"name": "Pauwels van Haverbeke", "sex": "m", "born": 1535, "died": 1582, "father": "N. van Haverbeke", "mother":null}, 
  {"name": "Clara Aernoudts", "sex": "f", "born": 1918, "died": 2012, "father": "Henry Aernoudts", "mother": "Sidonie Coene"}, 
  {"name": "Emile Haverbeke", "sex": "m", "born": 1877, "died": 1968, "father": "Carolus Haverbeke", "mother": "Maria Sturm"}, 
  {"name": "Lieven de Causmaecker", "sex": "m", "born": 1696, "died": 1724, "father": "Carel de Causmaecker", "mother": "Joanna Claes"}, 
  {"name": "Pieter Haverbeke", "sex": "m", "born": 1602, "died": 1642, "father": "Lieven van Haverbeke", "mother":null}, 
  {"name": "Livina Haverbeke", "sex": "f", "born": 1692, "died": 1743, "father": "Daniel Haverbeke", "mother": "Joanna de Pape"}, 
  {"name": "Pieter Bernard Haverbeke", "sex": "m", "born": 1695, "died": 1762, "father": "Willem Haverbeke", "mother": "Petronella Wauters"}, 
  {"name": "Lieven van Haverbeke", "sex": "m", "born": 1570, "died": 1636, "father": "Pauwels van Haverbeke", "mother": "Lievijne Jans"}, 
  {"name": "Joanna de Causmaecker", "sex": "f", "born": 1762, "died": 1807, "father": "Bernardus de Causmaecker", "mother":null}, 
  {"name": "Willem Haverbeke", "sex": "m", "born": 1668, "died": 1731, "father": "Lieven Haverbeke", "mother": "Elisabeth Hercke"}, 
  {"name": "Pieter Antone Haverbeke", "sex": "m", "born": 1753, "died": 1798, "father": "Jan Francies Haverbeke", "mother": "Petronella de Decker"}, 
  {"name": "Maria van Brussel", "sex": "f", "born": 1801, "died": 1834, "father": "Jan Frans van Brussel", "mother": "Joanna de Causmaecker"}, 
  {"name": "Angela Haverbeke", "sex": "f", "born": 1728, "died": 1734, "father": "Pieter Bernard Haverbeke", "mother": "Livina de Vrieze"}, 
  {"name": "Elisabeth Haverbeke", "sex": "f", "born": 1711, "died": 1754, "father": "Jan Haverbeke", "mother": "Maria de Rycke"}, 
  {"name": "Lievijne Jans", "sex": "f", "born": 1542, "died": 1582, "father":null, "mother":null}, 
  {"name": "Bernardus de Causmaecker", "sex": "m", "born": 1721, "died": 1789, "father": "Lieven de Causmaecker", "mother": "Livina Haverbeke"}, 
  {"name": "Jacoba Lammens", "sex": "f", "born": 1699, "died": 1740, "father": "Lieven Lammens", "mother": "Livina de Vrieze"}, 
  {"name": "Pieter de Decker", "sex": "m", "born": 1705, "died": 1780, "father": "Joos de Decker", "mother": "Petronella van de Steene"}, 
  {"name": "Joanna de Pape", "sex": "f", "born": 1654, "died": 1723, "father": "Vincent de Pape", "mother": "Petronella Wauters"}, 
  {"name": "Daniel Haverbeke", "sex": "m", "born": 1652, "died": 1723, "father": "Lieven Haverbeke", "mother": "Elisabeth Hercke"}, 
  {"name": "Lieven Haverbeke", "sex": "m", "born": 1631, "died": 1676, "father": "Pieter Haverbeke", "mother": "Anna van Hecke"}, 
  {"name": "Martina de Pape", "sex": "f", "born": 1666, "died": 1727, "father": "Vincent de Pape", "mother": "Petronella Wauters"}, 
  {"name": "Jan Francies Haverbeke", "sex": "m", "born": 1725, "died": 1779, "father": "Pieter Bernard Haverbeke", "mother": "Livina de Vrieze"}, 
  {"name": "Maria Haverbeke", "sex": "m", "born": 1905, "died": 1997, "father": "Emile Haverbeke", "mother": "Emma de Milliano"}, 
  {"name": "Petronella de Decker", "sex": "f", "born": 1731, "died": 1781, "father": "Pieter de Decker", "mother": "Livina Haverbeke"}, 
  {"name": "Livina Sierens", "sex": "f", "born": 1761, "died": 1826, "father": "Jan Sierens", "mother": "Maria van Waes"}, 
  {"name": "Laurentia Haverbeke", "sex": "f", "born": 1710, "died": 1786, "father": "Jan Haverbeke", "mother": "Maria de Rycke"}, 
  {"name": "Carel Haverbeke", "sex": "m", "born": 1796, "died": 1837, "father": "Pieter Antone Haverbeke", "mother": "Livina Sierens"}, 
  {"name": "Elisabeth Hercke", "sex": "f", "born": 1632, "died": 1674, "father": "Willem Hercke", "mother": "Margriet de Brabander"}, 
  {"name": "Jan Haverbeke", "sex": "m", "born": 1671, "died": 1731, "father": "Lieven Haverbeke", "mother": "Elisabeth Hercke"}, 
  {"name": "Anna van Hecke", "sex": "f", "born": 1607, "died": 1670, "father": "Paschasius van Hecke", "mother": "Martijntken Beelaert"}, 
  {"name": "Maria Sturm", "sex": "f", "born": 1835, "died": 1917, "father": "Charles Sturm", "mother": "Seraphina Spelier"}, 
  {"name": "Jacobus Bernardus van Brussel", "sex": "m", "born": 1736, "died": 1809, "father": "Jan van Brussel", "mother": "Elisabeth Haverbeke"} 
]); 
 
var ancestry = JSON.parse(ANCESTRY_FILE); 
 
var byName = {}; 
ancestry.forEach(function(person) { 
  byName[person.name] = person; 
}); 
 
function reduceAncestors(person, f, defaultValue) { 
  function valueFor(person) { 
    if (person == null) 
      return defaultValue; 
    else 
      return f(person, valueFor(byName[person.mother]), 
                       valueFor(byName[person.father])); 
  } 
  return valueFor(person); 
} 
 
function sharedDNA(person, fromMother, fromFather) { 
  if (person.name == "Pauwels van Haverbeke") 
    return 1; 
  else 
    return (fromMother + fromFather) / 2; 
} 
var ph = byName["Philibert Haverbeke"]; 
console.log(reduceAncestors(ph, sharedDNA, 0) / 4);

Answer 1

Как я понял нужно: console.log(reduceAncestors(ph, sharedDNA, 0) / 4);

Поехали

[valueFor] Значение для Emma de Milliano = 0
           Мать: Sophia van Damme = 0
           Отец: Petrus de Milliano = 0
[valueFor] Значение для Maria Sturm = 0
           Мать: Seraphina Spelier = 0
           Отец: Charles Sturm = 0
[valueFor] Значение для Joanna de Pape = 0
           Мать: Petronella Wauters = 0
           Отец: Vincent de Pape = 0
[valueFor] Значение для Elisabeth Hercke = 0
           Мать: Margriet de Brabander = 0
           Отец: Willem Hercke = 0
[valueFor] Значение для Anna van Hecke = 0
           Мать: Martijntken Beelaert = 0
           Отец: Paschasius van Hecke = 0
[valueFor] Значение для Lievijne Jans = 0
           Мать: null = 0
           Отец: null = 0
[sharedDNA] вызвано для Pauwels van Haverbekeб поэтому вернём 1
[valueFor] Значение для Pauwels van Haverbeke = 1
           Мать: null = 0
           Отец: N. van Haverbeke = 0
[valueFor] Значение для Lieven van Haverbeke = 0.5
           Мать: Lievijne Jans = 0
           Отец: Pauwels van Haverbeke = 1
[valueFor] Значение для Pieter Haverbeke = 0.25
           Мать: null = 0
           Отец: Lieven van Haverbeke = 0.5
[valueFor] Значение для Lieven Haverbeke = 0.125
           Мать: Anna van Hecke = 0
           Отец: Pieter Haverbeke = 0.25
[valueFor] Значение для Daniel Haverbeke = 0.0625
           Мать: Elisabeth Hercke = 0
           Отец: Lieven Haverbeke = 0.125
[valueFor] Значение для Livina Haverbeke = 0.03125
           Мать: Joanna de Pape = 0
           Отец: Daniel Haverbeke = 0.0625
[valueFor] Значение для Lieven de Causmaecker = 0
           Мать: Joanna Claes = 0
           Отец: Carel de Causmaecker = 0
[valueFor] Значение для Bernardus de Causmaecker = 0.015625
           Мать: Livina Haverbeke = 0.03125
           Отец: Lieven de Causmaecker = 0
[valueFor] Значение для Joanna de Causmaecker = 0.0078125
           Мать: null = 0
           Отец: Bernardus de Causmaecker = 0.015625
[valueFor] Значение для Maria de Rycke = 0
           Мать: Laurentia van Vlaenderen = 0
           Отец: Frederik de Rycke = 0
[valueFor] Значение для Elisabeth Hercke = 0
           Мать: Margriet de Brabander = 0
           Отец: Willem Hercke = 0
[valueFor] Значение для Anna van Hecke = 0
           Мать: Martijntken Beelaert = 0
           Отец: Paschasius van Hecke = 0
[valueFor] Значение для Lievijne Jans = 0
           Мать: null = 0
           Отец: null = 0
[sharedDNA] вызвано для Pauwels van Haverbekeб поэтому вернём 1
[valueFor] Значение для Pauwels van Haverbeke = 1
           Мать: null = 0
           Отец: N. van Haverbeke = 0
[valueFor] Значение для Lieven van Haverbeke = 0.5
           Мать: Lievijne Jans = 0
           Отец: Pauwels van Haverbeke = 1
[valueFor] Значение для Pieter Haverbeke = 0.25
           Мать: null = 0
           Отец: Lieven van Haverbeke = 0.5
[valueFor] Значение для Lieven Haverbeke = 0.125
           Мать: Anna van Hecke = 0
           Отец: Pieter Haverbeke = 0.25
[valueFor] Значение для Jan Haverbeke = 0.0625
           Мать: Elisabeth Hercke = 0
           Отец: Lieven Haverbeke = 0.125
[valueFor] Значение для Elisabeth Haverbeke = 0.03125
           Мать: Maria de Rycke = 0
           Отец: Jan Haverbeke = 0.0625
[valueFor] Значение для Jan van Brussel = 0
           Мать: Joanna van Rooten = 0
           Отец: Jacobus van Brussel = 0
[valueFor] Значение для Jacobus Bernardus van Brussel = 0.015625
           Мать: Elisabeth Haverbeke = 0.03125
           Отец: Jan van Brussel = 0
[valueFor] Значение для Jan Frans van Brussel = 0.0078125
           Мать: null = 0
           Отец: Jacobus Bernardus van Brussel = 0.015625
[valueFor] Значение для Maria van Brussel = 0.0078125
           Мать: Joanna de Causmaecker = 0.0078125
           Отец: Jan Frans van Brussel = 0.0078125
[valueFor] Значение для Livina Sierens = 0
           Мать: Maria van Waes = 0
           Отец: Jan Sierens = 0
[valueFor] Значение для Joanna de Pape = 0
           Мать: Petronella Wauters = 0
           Отец: Vincent de Pape = 0
[valueFor] Значение для Elisabeth Hercke = 0
           Мать: Margriet de Brabander = 0
           Отец: Willem Hercke = 0
[valueFor] Значение для Anna van Hecke = 0
           Мать: Martijntken Beelaert = 0
           Отец: Paschasius van Hecke = 0
[valueFor] Значение для Lievijne Jans = 0
           Мать: null = 0
           Отец: null = 0
[sharedDNA] вызвано для Pauwels van Haverbekeб поэтому вернём 1
[valueFor] Значение для Pauwels van Haverbeke = 1
           Мать: null = 0
           Отец: N. van Haverbeke = 0
[valueFor] Значение для Lieven van Haverbeke = 0.5
           Мать: Lievijne Jans = 0
           Отец: Pauwels van Haverbeke = 1
[valueFor] Значение для Pieter Haverbeke = 0.25
           Мать: null = 0
           Отец: Lieven van Haverbeke = 0.5
[valueFor] Значение для Lieven Haverbeke = 0.125
           Мать: Anna van Hecke = 0
           Отец: Pieter Haverbeke = 0.25
[valueFor] Значение для Daniel Haverbeke = 0.0625
           Мать: Elisabeth Hercke = 0
           Отец: Lieven Haverbeke = 0.125
[valueFor] Значение для Livina Haverbeke = 0.03125
           Мать: Joanna de Pape = 0
           Отец: Daniel Haverbeke = 0.0625
[valueFor] Значение для Pieter de Decker = 0
           Мать: Petronella van de Steene = 0
           Отец: Joos de Decker = 0
[valueFor] Значение для Petronella de Decker = 0.015625
           Мать: Livina Haverbeke = 0.03125
           Отец: Pieter de Decker = 0
[valueFor] Значение для Elisabeth Hercke = 0
           Мать: Margriet de Brabander = 0
           Отец: Willem Hercke = 0
[valueFor] Значение для Anna van Hecke = 0
           Мать: Martijntken Beelaert = 0
           Отец: Paschasius van Hecke = 0
[valueFor] Значение для Lievijne Jans = 0
           Мать: null = 0
           Отец: null = 0
[sharedDNA] вызвано для Pauwels van Haverbeke, поэтому вернём 1
[valueFor] Значение для Pauwels van Haverbeke = 1
           Мать: null = 0
           Отец: N. van Haverbeke = 0
[valueFor] Значение для Lieven van Haverbeke = 0.5
           Мать: Lievijne Jans = 0
           Отец: Pauwels van Haverbeke = 1
[valueFor] Значение для Pieter Haverbeke = 0.25
           Мать: null = 0
           Отец: Lieven van Haverbeke = 0.5
[valueFor] Значение для Lieven Haverbeke = 0.125
           Мать: Anna van Hecke = 0
           Отец: Pieter Haverbeke = 0.25
[valueFor] Значение для Willem Haverbeke = 0.0625
           Мать: Elisabeth Hercke = 0
           Отец: Lieven Haverbeke = 0.125
[valueFor] Значение для Pieter Bernard Haverbeke = 0.03125
           Мать: Petronella Wauters = 0
           Отец: Willem Haverbeke = 0.0625
[valueFor] Значение для Jan Francies Haverbeke = 0.015625
           Мать: Livina de Vrieze = 0
           Отец: Pieter Bernard Haverbeke = 0.03125
[valueFor] Значение для Pieter Antone Haverbeke = 0.015625
           Мать: Petronella de Decker = 0.015625
           Отец: Jan Francies Haverbeke = 0.015625
[valueFor] Значение для Carel Haverbeke = 0.0078125
           Мать: Livina Sierens = 0
           Отец: Pieter Antone Haverbeke = 0.015625
[valueFor] Значение для Carolus Haverbeke = 0.0078125
           Мать: Maria van Brussel = 0.0078125
           Отец: Carel Haverbeke = 0.0078125
[valueFor] Значение для Emile Haverbeke = 0.00390625
           Мать: Maria Sturm = 0
           Отец: Carolus Haverbeke = 0.0078125
[valueFor] Значение для Philibert Haverbeke = 0.001953125
           Мать: Emma de Milliano = 0
           Отец: Emile Haverbeke = 0.00390625
0.00048828125
Answer 2

Добавьте промежуточный вывод в консоль. Станет понятнее, что происходит. (Это не ответ.)

function sharedDNA(person, fromMother, fromFather) {
  if (person.name == "Pauwels van Haverbeke") {
    console.log(person.name, 1);
    return 1;
  } else {
    console.log(person.name, fromMother, fromFather, (fromMother + fromFather) / 2);
    return (fromMother + fromFather) / 2;
  }
}
READ ALSO
Symfony 3.4 не грузит CSS и JS

Symfony 3.4 не грузит CSS и JS

Не подгружаються стили и JS файлы, как в моем AppBundle так и в SanataAdminBundleФайлы подключены через assets, прим :

243
Как скрыть элемент в калькуляторе?

Как скрыть элемент в калькуляторе?

Элемент с надписью: "Сделано в конструкторе калькуляторов UCALC"

294
Как сделать слайдер?

Как сделать слайдер?

Порекомендуйте как сделать подобный слайдерПо нажатию на 1 из 3 миниатюр раскрывается слева картинка

270