在C#中,在算法中使用递归函数是一种好习惯吗?在许多使用递归的函数式语言中被认为是一个很好的实践。我认为这很好,因为编译器会为函数式语言优化代码。但是在创建算法时在C#中使用递归是好习惯吗?就C#而言,无论正确与否,递归算法都会导致您的堆栈增长非常显着(如果调用量非常大)并且这根本不会很快,并且可能导致堆栈溢出。或者是否还有一些优化可以使递归函数高效?如果您能在函数语言和C#中使用递归的算法之间进行一些比较(速度、内存、可读性),我将不胜感激。不使用递归会导致您用自己的“堆栈”重写算法,并在执行时出现类似情况。您可以根据算法的需要自定义堆栈大小,但如果您查看WPF/Silverlight和普通UI相关算法,它们本质上都是递归的,每次点击、每次按键和每个通知都会经过许多递归方法。查看创建具有自定义堆栈大小的线程,虽然速度可能因算法和复杂性而异,但创建一个单独的非递归算法将使任务更加复杂,因为您将使用列表、堆栈自己处理所有数据等存储操作。这在很大程度上是设计与性能的问题,如果您想要更好的性能,那么您的非递归算法将执行得更快,但设计和实现这样的算法将花费更长的时间。如果你想要一个更快的解决方案,那么你可以编写一个执行速度较慢的递归算法,但如果差异只有几毫秒或几微秒,那么它就不值得这样做。循环总是胜过递归,因为堆栈总是比你的状态有更多的开销。许多多线程操作会运行大量连线,因此您会走得更远。然而,可读性是一个很大的优势,所以我个人会使用递归,除非我需要每一滴性能,例如在图像处理操作中,或者我希望我的堆栈变得非常大-虽然堆栈溢出几乎完全是由于错误。在Microsoft当前的C#编译器实现中,没有进行尾调用优化。这使得深度递归函数算法溢出堆栈。虽然我不建议在C#中使用深度递归算法,但非深度递归的方法根本不会造成任何问题。递归迭代器性能一文详细解释了递归版本和非递归操作之间的区别。结果很有趣。查看函数式语言中的递归是良好实践的原因不是因为尾递归优化;这是一个很好的做法,因为它是表达大量算法的一种强大而简单的方法。优化就好了,反正尾调用优化跟所有的递归函数都没有关系。因此,考虑到这一点,如果这是表达算法的最自然方式,那么在c#中构建递归方法是非常好的做法。显然,如果事实证明存在堆栈深度问题,那么让它可迭代可能是有意义的。但是,采用自然递归算法并在不知道问题所在的情况下进行迭代是过早的优化,并且会使您的代码不必要地复杂且难以阅读以换取小的性能提升。当你需要递归时你需要它,例如深度优先树行走或递归下降解析。如果您有选择,比如使用递归而不是循环,那么它可能是您使用的语言的函数。把事情简单化。以上是C#学习教程:在C#中,在算法中使用递归函数是一种好的做法吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
