首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以用迭代代替这个递归吗?

问可以用迭代代替这个递归吗?
EN

Stack Overflow用户
提问于 2015-09-14 14:10:49
回答 3查看 130关注 0票数 0

有两种类型的工人:雇员和上级。

上级有下属集合,哪些项目是员工或上级。

上级的工资取决于其各级下属的工资。

现在我用递推法计算下属的工资:

代码语言:javascript
复制
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;
}

可以用迭代代替这个递归吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-14 14:15:31

是的是可能的。可以用迭代替换任何递归。用尾尾递归来实现这一点真的很容易。你只要把它改成循环。如果不是尾端,则需要将局部变量存储在堆栈中,并从堆栈中推和弹出(因为这都是递归函数调用提供给您的)。

虽然它最初看起来像是有尾尾递归,但是没有,因为它在一个循环中。当循环到外部循环时,您需要创建一个外部循环,并将局部变量(如worker)推送到外部循环。

票数 0
EN

Stack Overflow用户

发布于 2015-09-14 14:17:47

是的,是这样的。

带走所有的人。

按“等级”(“绝对位置”)排序。最低员工优先。然后是他们的上级。然后是他们的上级。然后..。最后是最高的“总统”。正确地这样做可能会很棘手。

对员工列表进行迭代,并逐个分配薪资。当你完成第一批最低级别的员工时,你就可以找到第一级的上级,并且你可以很容易地计算出他们的工资,因为所有低级别的员工都已经完成了,并且保证他们的工资已经被处理了,并且你不需要递归地“扫描”这个人的下属来计算它。

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

票数 0
EN

Stack Overflow用户

发布于 2015-09-14 15:47:54

谢谢大家。以下是我的非递归解决方案:

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32566990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档