Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   Как рекурсию заменить максимально быстрым циклом (https://javascript.ru/forum/offtopic/34833-kak-rekursiyu-zamenit-maksimalno-bystrym-ciklom.html)

megaupload 21.01.2013 03:19

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

	if(q>5) return;

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

ololo(1)

megaupload 21.01.2013 03:29

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

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 04:37

Как я понимаю все переменные и параметры которые использует функция нужно запихать в стек?

Deff 21.01.2013 06:02

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

ololo(1,5);

megaupload 21.01.2013 06:12

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

alertHTML( document.body )


function alertHTML(context){

    alert(this.innerHTML);

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

}

Dmitriyff 21.01.2013 13:00

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

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

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

  while (i--) alert(nodes[i]);
}

megaupload 21.01.2013 13:37

Dmitriyff,
Но ведь я создал эту тему для разбора способов развертывания рекурсии в циклы а не для какого-то конкретного решения проблемы; А Ваш вариант вообще, мягко говоря, не рекурсия;

Dmitriyff 21.01.2013 13:41

оу, сорри... не усмотрел =-))), сейчас придумаем

ksa 21.01.2013 13:59

Цитата:

Сообщение от megaupload
я создал эту тему для разбора способов развертывания рекурсии в циклы а не для какого-то конкретного решения проблемы

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

Возможно некие частные слочаи, где как раз возможно определить что-то конечное, и можно будет "развернуть" в циклы... Но "общего" решения не будет.

Dmitriyff 21.01.2013 14:18

как-то так

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


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