• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

szukanie rozwiazania

Object Storage Arubacloud
0 głosów
211 wizyt
pytanie zadane 7 sierpnia 2018 w JavaScript przez Mash92 Użytkownik (670 p.)

cześć , wrzucam kod który przeczytałem w książce o JS, wszystko spoko ale nie rozumiem paru linijek. Program pobiera z pliku JSON dane osób , imie nazwisko , kiedy urodzony, kiedy umarł, płeć oraz dane rodzicow. Wszystko to polega na tym ze autor chce się dowiedzieć ile ma wspolnego DNA z najstarsza osobą. Przyjmuje że 50% dziedziczy po rodzicach a oni 50% po swoich dziadkach itp itp.. nie rozumiem linijek 

return f(person, valueFor(byName[person.mother]),
                       valueFor(byName[person.father]));

oraz

    return (fromMother + fromFather) / 2;

nie wiem jak program pobiera frommother i fromfatcher.. gdyż nikt tam nie podaje wartości.

Pauwels van Haverbeke jest najstarszy a dziadek autora to Philbert Haverbake

tu jest cały kod

var ancestry = JSON.parse(ANCESTRY_FILE);

var byName = {};
ancestry.forEach(function(person) {
  byName[person.name] = person; ////////////// po wpisaniu name wrzuca wszystkie dane do tablicy ByName i przypisuje wartosc person
});

function reduceAncestors(person, f, defaultValue) {
  function valueFor(person) {
    if (person == null) /////////jezeli nie ma 
      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);

a to JSON 

var ANCESTRY_FILE = "[\n  " + [
  '{"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"}'
].join(",\n  ") + "\n]";

// Zapewnia eksport danych w node.js —
// require(./path/to/ancestry.js) pobierze tablicę.
if (typeof module != "undefined" && module.exports)
  module.exports = ANCESTRY_FILE;

 

komentarz 7 sierpnia 2018 przez StOcK Mądrala (6,100 p.)

w lini 13 masz parametry fromMother i fromFather

 return f(person, valueFor(byName[person.mother]),
                       valueFor(byName[person.father]));

 

komentarz 7 sierpnia 2018 przez Mash92 Użytkownik (670 p.)
no dobra a jak program wie że to akurat tam jest obliczane frommother i fromfatcher, i jak to dodaje do wartosci funkcja sharedDNA
komentarz 7 sierpnia 2018 przez StOcK Mądrala (6,100 p.)
Musiałbyś dokładnie prześledzić jak działa kod, co robi po kolei, zwracając SZCZEGÓLNĄ uwagę na parametry jakie przyjmują funkcje.
komentarz 7 sierpnia 2018 przez StOcK Mądrala (6,100 p.)

jak program wie że to akurat tam jest obliczane frommother i fromfatcher

hmmm,

wyobraź sobie taką sytuację:

function suma( a, b){
    return a+b;
}

var liczba_1=5;
var liczba_2=10;

alert( suma( liczba_1, liczba_2 ) );

Skąd program wie, że liczba_1 to jest a, a liczba_2 to jest b?

3 odpowiedzi

0 głosów
odpowiedź 7 sierpnia 2018 przez Tomek Sochacki Ekspert (227,510 p.)
Zobacz sobie choćby w konsoli co masz w obiekcie byName, dla każdej osoby masz własnie właściwość mother i father i je pobierasz poprzez valueFor(byName[person.mother]).
komentarz 7 sierpnia 2018 przez Mash92 Użytkownik (670 p.)
to funkcja ValueFor zapamietuje wynik stopnia DNA i oblicza kolejne pokolenie (do tyłu)?
0 głosów
odpowiedź 7 sierpnia 2018 przez StOcK Mądrala (6,100 p.)

Ok, zacznijmy od początku:

console.log(reduceAncestors(ph,sharedDNA,0) / 4);
function reduceAncestors(person, f, defaultValue) {
[...]
      return f(person, valueFor(byName[person.mother]),
                       valueFor(byName[person.father]));
[...]

f w parametrze funkcji to jest tak naprawdę sharedDNA w wywołaniu.

0 głosów
odpowiedź 8 sierpnia 2018 przez Mash92 Użytkownik (670 p.)
Panowie , zastanawiam się jeszcze na jakiej zasadzie działa ta rekurencja , jak funkcja szuka do tyłu i co zapisuje , na jakiej zasadzie wie jak się cofać .

Podobne pytania

0 głosów
0 odpowiedzi 759 wizyt
pytanie zadane 22 listopada 2018 w Python przez Adrian95p Nowicjusz (120 p.)
0 głosów
1 odpowiedź 206 wizyt
0 głosów
1 odpowiedź 235 wizyt
pytanie zadane 10 grudnia 2022 w JavaScript przez Dawidziu Bywalec (2,610 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...