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函数)。提前感谢您的帮助!
答案 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]));
...您可以在其中看到分配给fromMother
和fromFather
的第二个和第三个参数:
function sharedDNA(person, fromMother, fromFather) {
答案 1 :(得分:2)
你可以看到如下:
首先,f
和sharedDNA
在执行此特定呼叫期间是相同的。
其次,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代。