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


#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])
}

#41
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

#42

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


#43

ну хотя бы она работает без ошибки, но результат не верный
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

#44

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

Я вижу как часто пытаются причесать, модифицировать нерабочий код до рабочего состояния. Но реальность такая что это сложнее чем написать сначала.

Этот подход чаще не работает, и не дает понимания как именно был получен результат.


#45

ок


#46

функция 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

#47

запутался уже окончательно