是否可以用迭代替换此递归?

时间:2015-09-14 14:10:49

标签: c# recursion

有两种工人:员工和上级 Superior拥有Subordinates系列,其中包括Employee或Superior 高级的工资取决于所有级别的下属工资 现在我用递归计算下属的工资:

decimal SubordinatesSalary()
{
  decimal salary = 0;
  foreach ( Worker subordinate in Subordinates )
  {
    salary = salary + subordinate.SalaryPrim();
    Superior subordinateAsSuperior = subordinate as Superior;
    if ( subordinateAsSuperior != null )
      salary = salary + subordinateAsSuperior.SubordinatesSalary();
  }
  return salary;
}

是否可以用迭代替换此递归?

3 个答案:

答案 0 :(得分:0)

是的,这是可能的。可以用迭代替换任何递归。使用尾端递归非常容易。你只需将其更改为循环。如果它不是尾部,则需要将局部变量存储在堆栈中并从堆栈中弹出(因为这是一个递归函数调用给你)。

虽然它首先看起来像你有尾端递归,但你不是因为它处于循环中。当你循环到外部循环时,你需要创建一个外部循环并推送局部变量(如worker)。

答案 1 :(得分:0)

是的,是的。





带走所有人。





按“水平”(“绝对位置”)排序。员工最低。然后他们的上级。然后他们的上级。然后......最后是最顶级的“总统”。正确地执行此操作可能会非常棘手。





迭代该员工名单并逐个分配工资。当您完成第一批最低级别的员工时,您就可以到达一级上级,并且您可以轻松计算他们的工资,因为所有较低级别的员工已经完成,并且您可以保证他们的工资已经处理完毕,而您却没有需要递归“扫描”该人的下属来计算它。





但是......这真的合理吗?我认为当前的递归方式非常简洁。




答案 2 :(得分:0)

Thanks for all. Here is my non-recursive solution:

decimal SubordinatesSalary()
{
  decimal salary = 0;
  Stack<Worker> stack = new Stack<Worker>( Subordinates );
  while ( stack.Count > 0 )
  {
    Worker subordinate = stack.Pop();
    salary = salary + subordinate.SalaryPrim();
    Superior subordinateAsSuperior = subordinate as Superior;
    if ( subordinateAsSuperior != null )
      foreach ( Worker subordinate2 in subordinateAsSuperior.Subordinates )
        stack.Push( subordinate2 );
  }
  return salary;
}