Помогите с задачкой(новичок я еще в этом) [как реализовать foldr?]


#1

разделите итерацию массива и выполняемую операцию.
Напишите функцию, складывающую массив с любой заданной функцией
у меня ступор и не понимание условия и выполнения. Подскажите знающие люди

function fold(array, operation) {
// your code goes here
}
|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

#2

Даны функции

function add(a, b) { return a + b }
function mul(a, b) { return a * b }

И нужно написать такую fold, которая принимает массив и функцию вторым аргументом и вызывает эту функцию для первой пары значений, это результат1, потом берет результат1 и третье значение из массива вызывает функцию с ними, получает результат2 итд до конца массива. Это попытались записать в add(add(add(1, 2), 3), 4). Тебе нужно реализовать такие шаги, результат которых был бы как будто результат этих вызовов.


#3

спасибо большое, но у меня появилось ощущение, что для этой задачи у меня явно не хватает знаний и опыта :) Но стоит попробовать


#4

Пробовать обязательно потому что обучение как раз про то чтобы делать такое чего не знал как делать. И оно не будет получаться сначала. А потом со временем будет проще и проще.

Секрет в том чтобы разбивать задачу на такие шаги, которые ты можешь/знаешь как запрограммировать.

Например решение влоб:

  1. Попробуй для начала вывести через console.log первые два элемента массива, а потом по одному элементу до конца массива
  2. Замени console.log на вызов функции с запоминанем результата вызова. Там где логгируешь по одному элементу, вызывай функцию с элементом и результатом вызова + снова запоминай результат.

#5

спасибо, буду разбираться


#6

Чтобы легче понять “что от меня требуется” можно примеры решить самому и понять, какие операции должны быть выполнены для получения результата, “какие я проделал шаги, такие же должна выполнить программа”.


#7

ход решения я примерно понял, но как записать это - вот с этим проблема, опыт в написании и синтаксиса на уровне плинтуса


#8

что изучал, пробуй писать - подскажем если что. Какие есть мысли?


#9

это понятно? Сам можешь математически это проделать?


#10

получаем аргументом массив и функцию. Из массив циклом вытягиваем нулевое значение и вызываем функцию- результата пишем в переменную и так пока не будет строго равно 10. по аналогии подставляем другую функцию и перемножаем


#11

С рекурсией знаком?


#12

самовызывающеяся функция(слышал) но не использовал


#13

Похоже, что это для нее задача


#14

спасибо, пошел в google… изучать рекурсию


#15

Рекурсия, стек


#16

Все что делается с помощью рекурсии можно сделать с помощью цикла. Если нужно научиться программировать, то нужно научиться разбивать задачу на программируемые подзадачи. А как именно их реализовывать - с помощью рекурсии или цикла - это уже вопрос доступного набора инструментов.


#17

у меня в дз это следующая задачка…

  1. Write the same fold function recursively.
    Do not simulate cycle via recursion.

#18

ну вот что то нацарапал, дольше пока не совсем понимаю как правильно записать
function fold(array, operation) {
var sum = 0;
for (var i = 1; i < array.length; i++) {
sum+=array[i];
}
add(sum, array[i]);
return result
}

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


#19

Нужна переменная которая будет аккумулировать результаты вызова operation. С какими аргументами нужно вызвать operation первый раз?


#20

так?

function fold(array, operation) {

var sum = 1;
for (var i = 1; i < array.length; i++) {
sum+=array[i];
}
var x = add(sum, array[i]);
return x

// your code goes here
}

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