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


#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

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


#48

Это вторая тема. По возможно о задаче нужно начинать думать заранее. Чтобы была возможность свежей головой на следующий день посмотреть на тот же вопрос.

Все как по алгоритму к которому мы пришли выше

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))

#49

а почему в цикле начинаем с i=2 ?


#50

А что будет если мы не начнем с 2? А, допустим, с 0 как обычно пишут циклы?


#51

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


#52

спасибо большое, буду разбирать рекурсию


#53

Ты говоришь о частности. Для других параметров результат будет не в 2 раза больше. Думай категориями “первый элемент массива”, “второй элемент массива” итд. Без привязки к тому что именно в этих элементах.