Ты описываешь частный случай для сложения. Я хочу провести тебя по логической цепочке чтобы стало понятно решение в общем виде. С какими аргументами нужно вызывать operation
первый раз?
так же лимит сообщений, только через час будет доступно
Это конкретные значения. Как их описать если думать про их положение в массиве?
положение в массиве начинается с 0, аргументом у нас буду 0 и 1
О, гут. И будет некоторый результат выполнения операции с аргументами элементов 0 и 1 из массива. Так?
верно, результат будет 1, следующая итерация аргументы будут 1 и 2, результат 3
operation
сколько ожидает аргументов?
operation принимает функцию add. а она принимает два аргумента из массива
функция add и есть operation, но ответ что она принимает 2 аргумента верный
ну вы уж сильно не пинайте :)
Да, operation
нужно 2 аргумента.
Мы вызываем operation
с 2 первыми элементами массива как аргументами. Получаем значение. Кстати, для массива [6,4,8]
это соответствует вот этой строке add(6, 4)
из add(add(6, 4), 8)
Вопрос. Что нужно сделать со следующим элементом массива (получается третий элемент массива, в нашем конкретном случае равен 8) чтобы получить результат как при вызове add(add(6, 4), 8)
?
функция fold принимает два аргумента, один массив, другой функцию add, а в функцию add аргументами передаются числа из массива, я правильно понял?
Да
результат add(6, 4) записать в переменную например j, а потом add(j, 8)как то так наверно
Точно. И 8 брать как третий элемент массива. И это add(j, 8)
будет некоторым значением. Тут есть трюк в том что можно писать код вида в цикле перезаписывая значение результата новым значением j = add(j, 8)
.
Вопрос. А если элементов 4. Пусть массив [6,4,8,7]
. Что делать со следующим, четвертым элементом массива?
add(j, 8) записать так же в переменную и использовать как результат с четвертым элементом
Гут. И так повторять пока не закончатся элементы массива. Мы только что описали словами алгоритм работы
- Получить результат операции для первых двух элементов массива
- Для каждого следующего элемента массива вызвать результат предыдущего вызова операции с элементом массива
- Результат последней операции и есть результат
супер, не так все и страшно, как казалось. Буду педалить, спасибо тебе больше Добрый Человек!
продолжение следует :)
как правильно записать что бы для каждого следующего элемента массива вызвать результат предыдущего вызова операции с элементом массива -это еще одну функцию нужно писать?
function fold(array, add) {
var sum = 0;
for (var i = 1; i < array.length; i++) {
sum+=array[i];
}
var res = function add(a, b) {
return a + b
}
add(array[i] + res, sum)
}
console.log(res)
function mul(a, b) {
return a * b
}
fold([1, 2, 3, 4], add) // add(add(add(1, 2), 3), 4) === 10
fold([1, 2, 3, 4], mul) // 24
var res
for (тут arr и i) {
res = op(res, arr[i])
}