|
Как рекурсию заменить максимально быстрым циклом
function ololo(q) {
if(q>5) return;
alert(q);
ololo(q+1);
}
ololo(1)
|
Вот это же не правильный вариант?
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);
}
}
|
Как я понимаю все переменные и параметры которые использует функция нужно запихать в стек?
|
function ololo(a,b) {
for(var i=1; i<b+1; i++){alert(i);}
}
ololo(1,5);
|
Deff, спасибо; Вы гений; Ваш пример превосходит мой в разы; А теперь сделайте то же самое с этим:
alertHTML( document.body )
function alertHTML(context){
alert(this.innerHTML);
for ( var i = 0; context.childNodes.lenght; i++ ) {
alertHTML(context.childNodes[i])
}
}
|
если вас порядок нод не волнует
самый быстрый так
alertHTML(document.body);
function alertHTML(context) {
var nodes = context.childNodes,
i = nodes.length;
while (i--) alert(nodes[i]);
}
|
Dmitriyff,
Но ведь я создал эту тему для разбора способов развертывания рекурсии в циклы а не для какого-то конкретного решения проблемы; А Ваш вариант вообще, мягко говоря, не рекурсия; |
оу, сорри... не усмотрел =-))), сейчас придумаем
|
Цитата:
Потому как не известно не только число итераций, но и уровень вложения. Возможно некие частные слочаи, где как раз возможно определить что-то конечное, и можно будет "развернуть" в циклы... Но "общего" решения не будет. |
как-то так
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, время: 12:15. |
|