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


#21

Ты описываешь частный случай для сложения. Я хочу провести тебя по логической цепочке чтобы стало понятно решение в общем виде. С какими аргументами нужно вызывать operation первый раз?


#22

так же лимит сообщений, только через час будет доступно


#23

Это конкретные значения. Как их описать если думать про их положение в массиве?


#24

положение в массиве начинается с 0, аргументом у нас буду 0 и 1


#25

О, гут. И будет некоторый результат выполнения операции с аргументами элементов 0 и 1 из массива. Так?


#26

верно, результат будет 1, следующая итерация аргументы будут 1 и 2, результат 3


#27

operation сколько ожидает аргументов?


#28

operation принимает функцию add. а она принимает два аргумента из массива


#29

функция add и есть operation, но ответ что она принимает 2 аргумента верный


#30

ну вы уж сильно не пинайте :)


#31

Да, operation нужно 2 аргумента.

Мы вызываем operation с 2 первыми элементами массива как аргументами. Получаем значение. Кстати, для массива [6,4,8] это соответствует вот этой строке add(6, 4) из add(add(6, 4), 8)

Вопрос. Что нужно сделать со следующим элементом массива (получается третий элемент массива, в нашем конкретном случае равен 8) чтобы получить результат как при вызове add(add(6, 4), 8)?


#32

функция fold принимает два аргумента, один массив, другой функцию add, а в функцию add аргументами передаются числа из массива, я правильно понял?


#33

Да


#34

результат add(6, 4) записать в переменную например j, а потом add(j, 8)как то так наверно


#35

Точно. И 8 брать как третий элемент массива. И это add(j, 8) будет некоторым значением. Тут есть трюк в том что можно писать код вида в цикле перезаписывая значение результата новым значением j = add(j, 8).

Вопрос. А если элементов 4. Пусть массив [6,4,8,7]. Что делать со следующим, четвертым элементом массива?


#36

add(j, 8) записать так же в переменную и использовать как результат с четвертым элементом


#37

Гут. И так повторять пока не закончатся элементы массива. Мы только что описали словами алгоритм работы

  1. Получить результат операции для первых двух элементов массива
  2. Для каждого следующего элемента массива вызвать результат предыдущего вызова операции с элементом массива
  3. Результат последней операции и есть результат

#38

супер, не так все и страшно, как казалось. Буду педалить, спасибо тебе больше Добрый Человек!


#39

продолжение следует :)

как правильно записать что бы для каждого следующего элемента массива вызвать результат предыдущего вызова операции с элементом массива -это еще одну функцию нужно писать?
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

#40
var res
for (тут arr и i) {
	res = op(res, arr[i])
}