在C#中,在算法中使用递归函数是一个好习惯吗?

Vit*_*lij 17 c# algorithm recursion performance functional-programming

在许多使用递归的函数式语言中被认为是一种很好的实践.我认为这很好,因为编译器优化了函数式语言的代码.

但是在创建算法时,在C#中使用递归是一种好习惯吗?就C#而言,是否正确,递归算法将导致您的堆栈增长非常显着(如果调用量非常大)并且这根本不会快,并且可能导致堆栈溢出.或者还有一些优化可以使递归函数高效?

如果您在使用函数语言中的递归和C#的算法之间进行一些比较(速度,内存,可读性),我将不胜感激.

Aka*_*ava 15

不使用递归会导致您使用自己的"堆栈"重写算法,最终在执行时会遇到类似的情况.

您可以根据算法的需要自定义堆栈大小,但是如果您查看WPF/Silverlight和普通的UI相关算法,它们本质上都是递归的,每次点击,每次按键和每个通知都会经过很多递归方法.

查看使用自定义堆栈大小创建线程,

虽然速度可能会因算法和复杂性而有所不同,但创建单独的非递归算法会使任务变得更复杂,因为您将使用列表,堆栈等自行执行所有数据存储操作.

这是一个非常设计与性能问题,如果你想要更好的性能,那么你的非递归算法将更快地执行,但是设计和实现这样的算法需要更长的时间.如果你想要一个更快的解决方案,那么你可以编写递归算法,这将在执行速度较慢,但​​如果差异只有几毫秒或几微秒,那么它就不值得去做.

  • -1表示完全错过了该点.C#中的递归问题是,无论你决定使用哪种堆栈大小,你仍然可以超越它.递归(我们理解为直接或间接调用自身的函数)在一般情况下是无限制的:您不知道递归将有多深. (5认同)
  • +1表示算法状态必须*某处*. (4认同)

Ali*_*tad 6

循环总是超越递归,因为堆栈总是比你的状态有更多的开销.很多线程操作都会大量走线,因此您会进一步下滑.

但是,可读性是一个很大的优点所以我个人会使用递归,除非我需要每一滴性能,例如在图像处理操作中,或者我希望我的堆栈增长非常大 - 尽管堆栈溢出几乎完全是由于错误.


Hei*_*son 5

在Microsoft当前的C#编译器实现中,不进行尾调用优化.这使得深度递归的功能算法溢出堆栈.虽然我不建议在C#中使用深度递归算法,但是不能深度递归的方法根本不会引起任何问题.

  • 几乎但不太正确.请参阅我对@ Aliostad的回答的评论. (2认同)