Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.01.2013, 03:19
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Как рекурсию заменить максимально быстрым циклом
function ololo(q) {

	if(q>5) return;

	alert(q);
	ololo(q+1);
}

ololo(1)
Ответить с цитированием
  #2 (permalink)  
Старый 21.01.2013, 03:29
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Вот это же не правильный вариант?

var stark = [];
stark.push(1);



while(stark.length){

	var value = stark[stark.length-1];

	if(value>5){
		stark.pop();
		break;
	}else{
		alert(value);
		stark.push(value+1);
	}

}

Последний раз редактировалось megaupload, 21.01.2013 в 03:53.
Ответить с цитированием
  #3 (permalink)  
Старый 21.01.2013, 04:37
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Как я понимаю все переменные и параметры которые использует функция нужно запихать в стек?
Ответить с цитированием
  #4 (permalink)  
Старый 21.01.2013, 06:02
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

function ololo(a,b) {
  for(var i=1; i<b+1; i++){alert(i);}
}

ololo(1,5);
Ответить с цитированием
  #5 (permalink)  
Старый 21.01.2013, 06:12
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Deff, спасибо; Вы гений; Ваш пример превосходит мой в разы; А теперь сделайте то же самое с этим:

alertHTML( document.body )


function alertHTML(context){

    alert(this.innerHTML);

    for ( var i = 0; context.childNodes.lenght; i++ ) {
        alertHTML(context.childNodes[i])
    }

}

Последний раз редактировалось megaupload, 21.01.2013 в 06:15.
Ответить с цитированием
  #6 (permalink)  
Старый 21.01.2013, 13:00
Профессор
Отправить личное сообщение для Dmitriyff Посмотреть профиль Найти все сообщения от Dmitriyff
 
Регистрация: 22.07.2012
Сообщений: 164

если вас порядок нод не волнует

самый быстрый так
alertHTML(document.body);

function alertHTML(context) {
  var nodes = context.childNodes,
        i = nodes.length;

  while (i--) alert(nodes[i]);
}
Ответить с цитированием
  #7 (permalink)  
Старый 21.01.2013, 13:37
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Dmitriyff,
Но ведь я создал эту тему для разбора способов развертывания рекурсии в циклы а не для какого-то конкретного решения проблемы; А Ваш вариант вообще, мягко говоря, не рекурсия;
Ответить с цитированием
  #8 (permalink)  
Старый 21.01.2013, 13:41
Профессор
Отправить личное сообщение для Dmitriyff Посмотреть профиль Найти все сообщения от Dmitriyff
 
Регистрация: 22.07.2012
Сообщений: 164

оу, сорри... не усмотрел =-))), сейчас придумаем
Ответить с цитированием
  #9 (permalink)  
Старый 21.01.2013, 13:59
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от megaupload
я создал эту тему для разбора способов развертывания рекурсии в циклы а не для какого-то конкретного решения проблемы
Рекурсия (правильная не как у тебя в первом случае ) циклом не опишется. Она для того и делается.
Потому как не известно не только число итераций, но и уровень вложения.

Возможно некие частные слочаи, где как раз возможно определить что-то конечное, и можно будет "развернуть" в циклы... Но "общего" решения не будет.
Ответить с цитированием
  #10 (permalink)  
Старый 21.01.2013, 14:18
Профессор
Отправить личное сообщение для Dmitriyff Посмотреть профиль Найти все сообщения от Dmitriyff
 
Регистрация: 22.07.2012
Сообщений: 164

как-то так

var f = function(nodes) {

	var	node, 
		stack = [];

	stack.push(nodes)

	while (stack.length) {

		node = stack.pop();

		if (node.childNodes.length) {

			var i = node.childNodes.length;

			while(i--) stack.push(node.childNodes[i]);
		} else {
			console.log(node);
		}
	}
}
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по replace. Как заменить все точки в строке? Pluto Общие вопросы Javascript 14 21.04.2017 12:32
Как изменять имена переменных циклом Ivan Draga Общие вопросы Javascript 5 21.01.2011 08:46
Как заменить встроенную функцию Alert? KIVagant Общие вопросы Javascript 4 22.04.2010 11:13
DOM vs iframe. Как в ифрейме заменить выделенный текст (его innerHTML)? Бухалыч Events/DOM/Window 4 20.08.2009 14:30
Как заменить эл-ты одного списка эл-тами другого ? Mayar Элементы интерфейса 5 28.04.2009 11:21