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 как обычно пишут циклы?
я понял, результат будет в два раза больше
спасибо большое, буду разбирать рекурсию
Ты говоришь о частности. Для других параметров результат будет не в 2 раза больше. Думай категориями “первый элемент массива”, “второй элемент массива” итд. Без привязки к тому что именно в этих элементах.