Как написать рекурсивную функцию из цикла?
//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
Да, не надо идти на это рекурсивно.