【发布时间】: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# 循环它。