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

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

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

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

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

1 лайк

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

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

я понял, результат будет в два раза больше