Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.12.2015, 17:02
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Из области замыканий и рекурсивного определения
Здравствуйте. В учебнике попалась задача
sum(2, 5, 10); // 17
sum(2, 5)(10); // 17
sum(2)(5)(10); // 17
sum(2)(5, 10); // 17

Здесь жёстко было определено, что можно использовать только три числовых аргумента и функция должна вернуть результат. Здесь как бы не сложно, мой один из вариантов:
function sum(){
	var arg = arguments;
		var summa = sumArg(arg);
		var x = (3 - arg.length);
		if (!x) return summa;
		else
		return function a(){
			var arg = arguments;
			x -= arg.length;
			summa += sumArg(arg);
			if (!(x)) return summa;
			else return a;
		};
}


	function sumArg(arg){
	var itog = 0;
	var len = arg.length;
	for(var x = 0; x < len; x++){
		itog += arg[x];
	};
	return itog;
	}
	
sum(2, 5, 10); // 17
sum(2, 5)(10); // 17
sum(2)(5)(10); // 17
sum(2)(5, 10); // 17

Тут зная когда закончатся аргументы мы сделаем возврат значения (прервём цепочку создания объектов вызова и вернём значение "верхнего" замыкания, не сложно). Вопрос состоит вот в чём, как можно определить при выполнении функции (как бы вылезти наружу вперёд до окончания выполнения) как будет использоваться возвращаемое функцией значение. Если брать вышеуказанный пример, когда происходит последний вызов в выражении если заранее не известно количество предстоящих вызовов . Спасибо, извините за каламбур
Ответить с цитированием
  #2 (permalink)  
Старый 27.12.2015, 17:37
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Варианты решения
Ответить с цитированием
  #3 (permalink)  
Старый 27.12.2015, 17:58
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

uanr81, а где рекурсия то? (вызов функции внутри себя)

Последний раз редактировалось Rise, 27.12.2015 в 18:00.
Ответить с цитированием
  #4 (permalink)  
Старый 27.12.2015, 21:46
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Рекурсивно делает ссылку на саму себя с уже переопределёнными переменными. Вопрос в этом и был, можно ли предупредить когда нужно вызвать функцию. Судя по ответам, существует проблема донести вопрос. Спасибо
Ответить с цитированием
  #5 (permalink)  
Старый 27.12.2015, 22:00
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от uanr81 Посмотреть сообщение
Рекурсивно делает ссылку на саму себя с уже переопределёнными переменными.
Где пример? В вашем коде этого нет. О том и речь...
Ответить с цитированием
  #6 (permalink)  
Старый 27.12.2015, 22:01
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Честно говоря не понял??
Ответить с цитированием
  #7 (permalink)  
Старый 27.12.2015, 22:03
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

uanr81, про карринг почитайте может поможет...
Ответить с цитированием
  #8 (permalink)  
Старый 27.12.2015, 22:22
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

function a(){// здесь привязываем имя (а) к объекту функции
			var arg = arguments;
			x -= arg.length;
			summa += sumArg(arg);
			if (!(x)) return summa;// пока здесь ложь
			else return a;/*рекурсивно возвращаемся через ссылку   
* на новое определение функции, где от "x"  отняли и к "summa"  
* прибавили и тд.
*/   
		};
Ответить с цитированием
  #9 (permalink)  
Старый 27.12.2015, 22:27
Интересующийся
Отправить личное сообщение для uanr81 Посмотреть профиль Найти все сообщения от uanr81
 
Регистрация: 14.12.2015
Сообщений: 18

Карринг как я понял это создание новой функции с измененной функциональностью, а здесь я так понимаю игра с интерпретатором, с тем как создаётся объект функции и внешняя ссылка на объект вызова
Ответить с цитированием
  #10 (permalink)  
Старый 27.12.2015, 23:48
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

uanr81, например последний вызов делать без аргументов:
sum(2, 5, 10)();
sum(2, 5)(10)();
sum(2)(5)(10)();
sum(2)(5, 10)();
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доступ к главной области видимости Penetrator Angular.js 1 21.01.2015 23:13
Получить координаты области выделенного текста oleg.oreshenko Общие вопросы Javascript 0 06.12.2013 11:15
Почему hide() уменьшает размер текстовой области? Rooner jQuery 1 05.12.2012 21:47
стили Css в зависимости от высоты активной области браузера Vladimir_Kl Javascript под браузер 3 23.03.2011 16:04
Скрипт определения WMID по WMZ AvaGet Общие вопросы Javascript 3 17.12.2008 03:59