有两种工人:员工和上级 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;
}
是否可以用迭代替换此递归?
答案 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;
}