2015-03-25 89 views
0

嗨,我有一個關於遞歸算法的問題。 此代碼運行時間過長。我已經從互聯網搜索,我有一個計劃,將算法從遞歸更改爲迭代。因爲沒有「返回」條件(它總是循環,直到年份,類型,操作,位置,部門和位置的列表完成),所以我很難更改代碼。將遞歸算法轉換爲迭代算法

如何更改算法?

這裏是代碼:

DataSet dataSet = new DataSet(); 
var years = GetDataForReportMonthlyFTEWorkCompletionByDepartment(new string[] { string.Empty }, group); 
foreach (var year in years) 
{ 
    var types = GetDataForReportMonthlyFTEWorkCompletionByDepartment(new string[] { year.Year.ToString() }, group); 
    foreach (var type in types) 
    { 
     var departments = GetDataForReportMonthlyFTEWorkCompletionByDepartment(new string[] { year.Year.ToString(), type.ContractorType }, group); 
     foreach (var department in departments) 
     { 
      var operations = GetDataForReportMonthlyFTEWorkCompletionByDepartment(new string[] { year.Year.ToString(), type.ContractorType, department.Department }, group); 
      foreach (var operation in operations) 
      { 
      var positions = GetDataForReportMonthlyFTEWorkCompletionByDepartment(new string[] { year.Year.ToString(), type.ContractorType, department.Department, operation.Operation }, group); 
      foreach (var position in positions) 
      { 
       var locations = GetDataForReportMonthlyFTEWorkCompletionByDepartment(new string[] { year.Year.ToString(), type.ContractorType, department.Department, operation.Operation, position.Position }, group); 
       foreach (var location in locations) 
       { 
        DataTable tbl = ReportExport.ConvertToDataTable<ReportMonthlyFTE>(
            GetDataForReportMonthlyFTEWorkCompletionByDepartment(new string[] { year.Year.ToString(), type.ContractorType, department.Department, operation.Operation, position.Position, location.Location }, group).ToList()); 
            dataSet.Tables.Add(tbl); 
       } 
      } 
     } 
     } 
    } 
} 
+4

我認爲你是混淆迭代和遞歸。你發佈的代碼是完全迭代的。它使用for循環而不是調用自己 – codingadventures 2015-03-25 02:27:52

+0

GetDataForReportMonthlyFTEWorkCompletionByDepartment()做什麼?它被調用了很多,可能是你的性能問題的原因。 – 2015-03-25 02:28:58

+0

感謝您的答覆,函數GetDataForReportMonthlyFTEWorkCompletionByDepartment()從sql服務器調用查詢(選擇)根據給出的參數 – user3425864 2015-03-25 02:34:29

回答

0

我想yield可能會解決你的問題。這將允許您從調用代碼中控制枚舉,以便在需要時可以提前退出。

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (var dataTable in GetData()) 
     { 
      Console.WriteLine("Got more data."); 

      Console.WriteLine("Continue getting more data?"); 
      ConsoleKeyInfo keyInfo = Console.ReadKey(); 

      if (keyInfo.KeyChar != 'y') 
      { 
       // Stop enumerating. 
       break; 
      } 
     } 

     Console.ReadKey(true); 
    } 

    static IEnumerable<DataTable> GetData() 
    { 
     while (true) 
     { 
      yield return new DataTable(); 
     } 
    } 
} 

另請注意,退貨類型爲IEnumerable<out T>