循环代码或递归方法调用?

时间:2014-02-05 20:46:14

标签: c# recursion logic

我正在开发项目,我们必须根据数据库中的规则计算交货时间。同一天可以有几种可能性(当天交货),但周五,周六没有规则,所以我们必须向前看并找到周一规则。

很抱歉长篇大论的解释......

为了增加复杂性,我们还计算何时可以在交货点收集物品,以便我们根据上午/下午保证计算上货时间,并确保地点是开放的,而不是假期...

当我最初编写逻辑时,我创建了一个方法,该方法获取日期并计算所有这些值并返回我们的计算模型。就在结束之前,我进行了测试,以确保模型已填充,否则没有匹配该日期和时间,我将日期增加1并再次调用我的方法,增加日期时间和规则,直到我点击返回和一切气泡回到原来的堆栈调用。对于我来说,它就像一个魅力,单级if语句,没有复杂的和/或

基本上代码被删除了,因为其他测试和bug开发人员不了解如何调试它或它正在做什么。

新提案是一个单独的方法,它执行相同的操作但包含在while语句中,直到满足条件。然后在一段时间内有一个foreach验证交付可以满足,一行条件if和嵌套条件或者然后返回计算模型。

在调整值达到最终条件之前从内部回忆相同的方法是不是很糟糕?

两个代码片段都可以正常工作我只是发现嵌入了while和条件中的每一个,如果比一组平规则更难解密。

1 个答案:

答案 0 :(得分:2)

虽然递归可以导致一些优雅的解决方案,但它也会导致难以遵循代码和堆栈溢出,因为每个递归调用都会分配一个新的堆栈帧。默认情况下,每个线程都有1MB的堆栈,因此空间不足可能需要很长时间。

尾递归可以解决这个问题,只要你实际进行尾递归调用,编译器就可以发现这一点。在IL级别,支持使用TailCall指令进行尾递归,但C#编译器不会生成使用它的代码。