Преобразовать цикл for в рекурсивную функцию

#javascript #for-loop #recursion

#javascript #for-цикл #рекурсия

Вопрос:

У меня есть цикл for, и я хотел бы преобразовать его в рекурсивную функцию.

У меня есть приглашение, которое должно появляться для каждого элемента и быть отклонено перед переходом к следующему элементу в списке. Такое поведение, похоже, не работает с обычным циклом for . Цикл завершается еще до отображения приглашения, а затем отображается только одно приглашение, даже если в списке есть более одного элемента, для которого должно было быть отображено приглашение.

(Я не совсем уверен, будет ли это работать с рекурсивной функцией, но из того, что я прочитал, это кажется многообещающим. Если я ошибаюсь в этом, то нет смысла делать преобразование.)

Я рассматривал другие примеры, но, похоже, никак не могу взять в толк, как именно они работают.

Вот мой оригинальный цикл:

 for(var i = 0;i < items.get_count();i  ) {
        var item = items.getItemAtIndex(i);

            //Is the item we're looking at in need of approval?
            if (item.get_item("_ModerationStatus") === 2)
            {
                //Yes, prompt for approval. (code for prompt goes here.)
                //Wait until prompt has received a response before going on next list item. 
            }

            else
            {
                //No, do nothing.
            }
        }   
 

Моя попытка выглядит немного грустной. Я не совсем уверен, куда идти дальше:

 function recursiveCheckRequests(i)
        {
            if (i < items.get_count())
            {
                function checkRequest(items, )
                //???
            }

        }
        recursiveCheckRequests(0);
 

Комментарии:

1. item.get_item("_ModerationStatus") Возможно, ваше значение само по себе не является целым числом. Попробуйте вместо этого проверить == 2 или === "2"

2. Верхний блок кода работает нормально. (Когда я помещаю поля с предупреждениями в обработчики if инструкции, поля отображаются, как и ожидалось.) Так что я не думаю, что это проблема.

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

Ответ №1:

Вы должны вызвать функцию изнутри самой себя.

 function recursiveCheckRequests(i) {
    var item = items.getItemAtIndex(i);
    //Is the item we're looking at in need of approval?
    if (item.get_item("_ModerationStatus") === 2) {
        //Yes, prompt for approval. (code for prompt goes here.)
        //Wait until prompt has received a response before going on next list item.
    }
    if (i   1 < items.get_count()) {
        recursiveCheckRequests(i   1);
    }
}
recursiveCheckRequests(0);
 

Комментарии:

1. Ах да, это работает отлично. Он продолжает вызывать себя, если все еще есть элементы, и завершает работу, если их нет. Рекурсия все еще немного сбивает с толку, но для меня имеет смысл, почему это работает!

Ответ №2:

это то, что я бы сделал

    function recursiveCheckRequests(pos,arr,length)
    {
        if (pos === length){
             return true;
         }

            //do something here with the array
         return recursiveCheckRequests(pos 1,length)
   }
    recursiveCheckRequests(0,array,array.length);
 

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