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