2

Marijn Haverbeke の著書Eloquent JavaScriptを使用して Javascript を勉強していますが、次の例がわかりませんでした。

function reduce(combine, base, array) {
    forEach(array, function (element) {
        base = combine(base, element);
    });
    return base;
}

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

function sum(numbers) {
    return reduce(add, 0, numbers);
}

このforEach関数は、彼が本で以前に紹介したもので、次のとおりです。

function forEach(array, action) {
    for(var i = 0; i < array.length; i++)
        action(array[i]);
}

さて、関数に戻りますが、reduce私が理解していないのは、sum関数でto0として渡される理由です。変じゃない?実行しようとしているとしましょう...最初のループのように見えませんか? 理解できません。basereducesum([1,2,3])0 = add(0,1)

4

3 に答える 3

2

足し算後は合計baseのみに入れます。したがって、ループごとに増分されます。

base = combine(base, element)

このステートメントは、最初にそれを計算combine(base, element)してに割り当てbaseます。その比較0ではなく、add(0, 1)。したがって、次の反復でbaseは、前のすべての値の合計が得られます。

編集済み

と呼びますreduce(combine, 0, [10, 22, 7, 5])。ループは次のように繰り返されます

Iteration           base          element
1                   0             10

計算後add(base, element)baseは10に設定されます。したがって、次の反復では、その値は10になります。

1                   10            22

計算後add(base, element)baseは32に設定されます。したがって、次の反復では、その値は32になります。

1                   32            7

計算後add(base, element)baseは39に設定されます。したがって、次の反復では、その値は39になります。

1                   39            5

計算後add(base, element)baseは44に設定されます。要素が残っていないため、答えは44です。

于 2012-10-01T12:33:16.900 に答える
1

base は、すべての要素の合計を含む変数です。0から始まるのが普通です。

そうではありません: 0 = add(0,1)

むしろ: base には base の前の値と 1 の合計が含まれます

于 2012-10-01T12:35:21.913 に答える