Eloquent Javascript:高阶函数示例

时间:2014-08-04 18:24:54

标签: javascript

  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);
  // → 0.00049

我在Eloquent Javascript中理解这个例子时遇到了很多麻烦。这是高阶函数章节(第5章)末尾的例子,标题是“伟大的伟大的......”#34;我不知道母亲和父亲在哪里获得他们的价值观。我认为他们指的是valueFor(byName [person.mother]和valueFor(byName [person.father]),但我不知道" valueFor"函数是如何或何时检索到的来自数据的实际数值(请注意,我显然没有包含此帖子中的数据,也没有包含byName函数)。提前感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

reduceAncestors(ph, sharedDNA, 0) / 4)sharedDNA函数作为第二个参数传递。

此处分配给f

function reduceAncestors(person, f, defaultValue)
在这里调用

f

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

...您可以在其中看到分配给fromMotherfromFather的第二个和第三个参数:

function sharedDNA(person, fromMother, fromFather) {

答案 1 :(得分:2)

你可以看到如下:

首先,fsharedDNA在执行此特定呼叫期间是相同的。

其次,valueOf可以返回以下值:

  • 0,person == null

  • 1,person == "Pauwels van Haverbeke"时(见shareDNA

  • 0到1之间的另一个值,以前计算的值的平均值为:(fromMother + fromFather) / 2

因此,如果在“Philibert Haverbeke”的祖先中找不到“Pauwels van Haverbeke”,则最终值将为0.

但如果“Pauwels van Haverbeke”被发现是“Philibert Haverbeke”的直接父母,那么在console.log中除以4之前的最终值是

(0 + 1) / 2 = 1/2

如果发现“Pauwels van Haverbeke”为祖母,则最终值为

((0 + 0) / 2 + (0 + 1) / 2) / 2 = 1/4

更一般地说,如果他找到了n代,那么最终的值是

2 ^ (-n)

现在2 ^( - 11)碰巧是0.0004882813 ...,所以你的(圆形)结果0.00049意味着 Pauwels van Haverbeke Philibert Haverbeke 的祖先,考虑到console.log中有4除法,提前9代。