雄辩的Javascript:高阶函数示例

Eloquent Javascript: Higher Order Functions example

本文关键字:函数 高阶 Javascript      更新时间:2023-09-26
  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 章(末尾的示例,标题为"曾-曾-曾......"我看不出母亲和父亲从哪里得到他们的价值观。我认为他们指的是valueFor(byName[person.mother]和valueFor(byName[person.father](,但我看不出"valueFor"函数如何或何时从数据中检索实际的数字值(请注意,我显然没有在这篇文章中包含数据,也没有包括byName函数(。提前感谢任何帮助!

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) {

您可以看到如下:

首先,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 的祖先,早 9 代,考虑到在 console.log 中有 4 的除法。