Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Миллион нубских вопросов от новичка (https://javascript.ru/forum/misc/77076-million-nubskikh-voprosov-ot-novichka.html)

MarkSM 22.03.2019 18:57

Зачем в данном случае нужен метод Math.floor, если убрав его ничего не меняется. Буду благодарен за ответ , для моего понимания...


function reverseArrayInPlace(array) {
for (var i = 0; i < Math.floor(array.length - 1 - i); i++) {
let old = array[i];
array[i] = array[array.length - 1 - i];
array[array.length - 1 - i] = old;
}
return array;
}




let arrayValue = [1, 2, 3, 4, 5, 6];
reverseArrayInPlace(arrayValue);
console.log(arrayValue);
// → [6, 5, 4, 3, 2, 1]

j0hnik 22.03.2019 19:02

В данном случае Math.floor не нужен

function reverse(array) {
	var j = array.length - 1;
	for (var i = 0; i < j; i++, j--) {
		[array[i], array[j]] = [array[j], array[i]];
	}
	return array;
}

Malleys 25.03.2019 09:18

Цитата:

Сообщение от Nexus
Без генератора скрипт будет пытаться создать массив бесконечной длины, с генератором будет суммировать числа до бесконечности.

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

Nexus 25.03.2019 09:30

Цитата:

Сообщение от Malleys
Nexus, пробовать надо хотя бы, уверенность без экспериментов пустые слова и буквы и слова...

Попробовал, разницы с тем, что я написал не увидел.

//Attention: infinity loop
function* range(start, end) {
	for (let i = start; i <= end; i++)
		yield i;
}

function sum(array) {
	let total = 0;
	for(const value of array)
		total += value;

	return total;
}

sum(range(0, Infinity));

Malleys 25.03.2019 09:48

ОК, я такого, что вы тут написали даже и не запускал! В №9 чуть другой пример!

Вычисление range(1, Infinity) |> take.bind(null, 5) |> sum |> alert без итератора (Осторожность! Бесконечный цикл!)
function range(start, end) {
	let array = []; 
	for (var i = start; i <= end; i++)
		array.push(i);

	return array;
} 

function sum(array) {
	let total = 0;
	for(const value of array)
		total += value;

	return total;
}

function* take(n, xs) {
	for(const x of xs) {
		if(n-- <= 0)
			break;

		yield x;
	}
}

alert(sum(take(5, range(1, Infinity))));


Вычисление range(1, Infinity) |> take.bind(null, 5) |> sum |> alert с итератором (Запускайте смело!)
function* range(start, end) {
	for (let i = start; i <= end; i++)
		yield i;
}

function sum(array) {
	let total = 0;
	for(const value of array)
		total += value;

	return total;
}

function* take(n, xs) {
	for(const x of xs) {
		if(n-- <= 0)
			break;

		yield x;
	}
}

alert(sum(take(5, range(1, Infinity))));

Nexus 25.03.2019 09:52

Цитата:

Сообщение от Malleys
В №9 чуть другой пример!

Я не про этот пример, с ним-то все понятно)
Меня изначально интересовало почему вы в коде из поста №7 использовали генератор, причина этого. Может я чего-то не знаю.
Видимо причины особой использовать генератор не было.
Не буду вас больше мучить вопросами, спасибо.

Malleys 25.03.2019 11:07

Цитата:

Сообщение от Nexus
Меня изначально интересовало почему вы в коде из поста №7 использовали генератор, причина этого.

Так я же ответил в посте №9. Первые два предложения отвечают на ваш вопрос, вы видимо не поняли что это значит, поэтому сначала откройте Chrome DevTools (⌥⌘I), затем запустите примеры в этом посте и посмотрите, как они выполняются по шагам, для этого в панели Sources нажимайте последовательно на Step into next function call , чтобы последовательно пройти через выполнение кода.

Вычисление range(1, Infinity) |> sum |> alert без итератора
function range(start, end) {
	let array = []; 
	for (var i = start; i <= end; i++)
		array.push(i);

	return array;
} 

function sum(array) {
	let total = 0;
	for(const value of array)
		total += value;

	return total;
}

debugger;
alert(sum(range(1, 5)));


Вычисление range(1, Infinity) |> sum |> alert с итератором
function* range(start, end) {
	for (let i = start; i <= end; i++)
		yield i;
}

function sum(array) {
	let total = 0;
	for(const value of array)
		total += value;

	return total;
}

debugger;
alert(sum(range(1, 5)));

рони 25.03.2019 11:21

Цитата:

Сообщение от Malleys
сначала откройте Chrome DevTools (⌥⌘I), затем запустите примеры в этом посте и посмотрите, как они выполняются по шагам, для этого в панели Sources нажимайте последовательно на Step into next function call

:thanks:

Nexus 25.03.2019 11:29

Цитата:

Сообщение от Malleys
Так я же ответил в посте №9. Первые два предложения отвечают на ваш вопрос, вы видимо не поняли что это значит

Все там понятно.
Непонятно, чем хуже вариант, в котором сначала создается массив значений, а после его значения суммируются.

Malleys 25.03.2019 11:34

Цитата:

Сообщение от Nexus
Непонятно, чем хуже вариант, в котором сначала создается массив значений, а после его значения суммируются.

Я нигде не говорил, что он хуже. В общем и целом сложность предложенного алгоритма была O(2n), я предложил вариант с O(n). Это не так критично, если вы только не будете суммировать миллионы чисел.


Часовой пояс GMT +3, время: 10:10.