Nisar A mohammad Ответов: 1

Как написать рекурсивную функцию из цикла?


//for loop on all serial no.
foreach (var item in usersGroupSrNo.ToList())
{
    //group by date of one serno
    var obj1 = item.GroupBy(x => x.timestamp.Date).ToList();

    //finding decreasing bettary level upto lowest so 4 variable for computing uses

    decimal? firstBatteryLevel = -1;
    DateTime? firstTimeStamp = null;
    decimal? lastBatteryLevel = -1;
    DateTime? lastTimeStamp = null;

    // ---------------------------------
    var orderedItems = item.OrderBy(x => x.timestamp).ToList();
    firstBatteryLevel = orderedItems[0].batteryLevel;
    firstTimeStamp = orderedItems[0].timestamp;
    for (var i = 1; i < orderedItems.Count(); i++)
    {
        if (orderedItems[i].batteryLevel > orderedItems[i - 1].batteryLevel)
        break;
        lastBatteryLevel = orderedItems[i].batteryLevel;
        lastTimeStamp = orderedItems[i].timestamp;
    }
    if(lastBatteryLevel == -1)
    {
        result.Add(new clsReturn()
        {
            srno = orderedItems[0].serialNumber,
            dailyavg = "",
            sstatus = "Unknown"
        });
        continue;
    }


Что я уже пробовал:

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

Afzaal Ahmad Zeeshan

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

Их алгоритмическая сложность (более или менее) одинакова.

Member 13566383

В коде, который вы опубликовали, есть несколько циклов.
Только один из циклов содержит оператор break. Когда этот оператор выполняется, ваш внешний цикл (foreach....) не завершится. Он только завершает цикл, непосредственно заключающий в себе этот оператор. Поэтому я думаю, что это то, что вы хотите, чтобы ваш код делал.
Вы можете переписать свой внутренний цикл с помощью оператора while-statement, если не хотите завершать цикл с помощью break;
Я не думаю, что преобразование вашего кода в рекурсивно вызываемый метод является хорошей альтернативой.
Кстати: последнее видимое утверждение в вашем фрагменте кода ("continue;") может быть ненужным. Но мы можем узнать об этом только в том случае, если увидим, где будет замкнут внешний контур.

PIEBALDconsult

Да, не надо идти на это рекурсивно.

1 Ответов

Рейтинг:
2

Patrice T

Цитата:
Глядя на преобразование цикла в рекурсивную функцию, как это должно было бы продолжаться для остальных записей, а не прерываться.

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

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