|
Как рекурсию заменить максимально быстрым циклом
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, время: 08:53. |
|