【问题标题】:Convert recursive algorithm to iterative algorithm将递归算法转换为迭代算法
【发布时间】:2015-03-25 11:16:12
【问题描述】:

您好,我对递归算法有疑问。 此代码运行时间过长。我已经从 Internet 上搜索过,并且计划将算法从递归更改为迭代。

我很难更改代码,因为没有“返回”条件(它总是循环直到完成年份、类型、操作、位置、部门和职位的列表)。

如何改变算法??

代码如下:

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);
                 }
             }
         }
      }
   }
}

【问题讨论】:

  • 我认为您混淆了迭代和递归。您发布的代码是完全迭代的。它使用 for 循环而不是调用自身
  • GetDataForReportMonthlyFTEWorkCompletionByDepartment() 有什么作用?它被调用了很多,很可能是您的性能问题的原因。
  • 感谢回复,GetDataForReportMonthlyFTEWorkCompletionByDepartment()函数根据给定参数从sql server(select)调用查询
  • 是的,看起来我在迭代和递归之间感到困惑,抱歉
  • 您真的要为每年年、类型、部门、操作、职位和位置组合调用这个吗?如果是这样,您可能应该只用一个查询将整个表拉回来,然后用 one for 循环用 C# 循环它。

标签: c# recursion


【解决方案1】:

我认为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&lt;out T&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多