Как рекурсивные вызовы функций работают в циклах? - PullRequest
1 голос
/ 21 июля 2010

У меня есть функция, в которой есть цикл, который вызывает функцию.

function displayItem(item, isChild)
{
    if (isChild)
    {
        writeOutput('<li>' & item.name & '</li>');
    }
    else
    {
        writeOutput('<li>' & item.name);
    }
    try
    {
        if (item.hasChild)
        {
            writeOutput('<ul>');
            numberOfItems = item.numChildren;
            for (x=1;x LT numberOfItems;x++)
            {
                displayItem(item.child[x], true);
            }
            writeOutput('</ul>');
        }
    }
    catch(Exception e){}
    writeOutput('</li>');
} 

После выполнения функции цикл продолжается от значения x из этого выполнения, а невыбирая, где он остановился раньше.

Например: x равен 3. displayItem передается "item.child [3]" и true.Он работает через функцию, входит в цикл, выполняет цикл до x = 4, затем выпадает из цикла.Функция завершается и (из того, что я понимаю) возвращается к точке, где x должно быть 3. Вместо того, чтобы взять из 3, добавить один (делая его 4) и затем выполнить цикл снова, он берет из 4 (значениеиз "внутреннего" рекурсивно называемого цикла).

Я знаю, что это звучит бессвязно, но я не могу придумать какой-либо другой способ объяснить это.или это просто жизненный факт и что-то, с чем мне приходится работать?

ОБНОВЛЕНИЕ: После более подробного анализа создается впечатление, что самый ранний цикл завершается рано.Использование локальной переменной для 'x' устранило проблему подсчета, но цикл просто выходит на 4, если смотреть на предыдущий пример.Уходит до того, как условие будет выполнено.Есть идеи?

Ответы [ 3 ]

7 голосов
/ 21 июля 2010

Вы забыли сделать x локальным для функции.

Не использовать глобальные переменные.Избегайте их, как чумы.

2 голосов
/ 21 июля 2010

Проблема в этой строке:

numberOfItems = item.numChildren;

При возврате из второго вызова это значение не возвращается обратно к правильному значению.Поэтому, если numberOfItems установлено в 4, когда функция вызывается сама по себе, после того, как она завершена и вернулась к исходному экземпляру функции, numberOfItems по-прежнему равно 4.

, этот код работает:

function displayItem(item, isChild)
{
    var x = 1;
    if (isChild)
    {
        writeOutput('<li>' & item.name & '</li>');
    }
    else
    {
        writeOutput('<li>' & item.name);
    }
    try
    {
        if (item.hasChild)
        {
            writeOutput('<ul>');
            for (x=1;x LT item.numChildren;x++)
            {
                displayItem(item.child[x], true);
            }
            writeOutput('</ul>');
        }
    }
    catch(Exception e){}
    writeOutput('</li>');
} 
0 голосов
/ 21 июля 2010

Попробуйте это

function displayItem(item, isChild)
{
   var x = 0;
   var numberOfItems = 0;

   if (isChild).......................
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...