C# 递归-何时使用它,何时不使用';你不用它吗

C# 递归-何时使用它,何时不使用';你不用它吗,c#,recursion,C#,Recursion,递归-什么时候使用它,什么时候不使用它?当它使问题变得更容易时,我会使用它,并且我有大量的堆栈内存(在大堆栈的情况下) 如果堆栈内存过高,我不会使用它(这样调用堆栈就不会变得太大,从而导致堆栈溢出和应用程序失败)。每当遇到需要递归的调用时,我都会使用它。非常依赖于语言。对于像Ruby这样没有很好的尾部调用优化的语言,要非常小心。真正的函数式语言更好地处理递归。在你开始过分依赖它之前,确保你知道它。我真正使用它的地方是当我知道输入和输出的全部界限时。如果我知道我永远不会深入100层,那么我会使用它

递归-什么时候使用它,什么时候不使用它?

当它使问题变得更容易时,我会使用它,并且我有大量的堆栈内存(在大堆栈的情况下)


如果堆栈内存过高,我不会使用它(这样调用堆栈就不会变得太大,从而导致堆栈溢出和应用程序失败)。

每当遇到需要递归的调用时,我都会使用它。

非常依赖于语言。对于像Ruby这样没有很好的尾部调用优化的语言,要非常小心。真正的函数式语言更好地处理递归。在你开始过分依赖它之前,确保你知道它。我真正使用它的地方是当我知道输入和输出的全部界限时。如果我知道我永远不会深入100层,那么我会使用它(至少在Ruby中),否则我会发现一种不同的模式。我希望递归更快,因为我经常会找到一个我喜欢的非常简洁的两行解决方案,但它不能稳定或快速地执行,所以我不得不替换它

如果而且只有当它显然是正确的解决方案,并且没有其他方法可能是正确的,我才会使用它

也许是阶乘函数,尽管可能不是。试试Fibonnaci序列

f(n) = f(n - 1) + f(n - 2), f(0) = f(1) = 1


如果您想要一个例子,说明通过递归显然可以解决的问题是如何迅速变得非常丑陋的。

通常,如果您可以用数据结构概念化问题,那么您可以使用递归来导航树。

如果您知道您的语言/环境对调用堆栈深度有限制,我不会使用它。我记得我使用过早期版本的Lotus Notes,它的深度限制为16层,这使得几乎任何递归的使用都是不可能的。

要了解何时使用递归,必须了解何时使用递归。:)你心里有没有一个特定的情况,你想知道是什么?还是只是一个模糊的一般性问题?你的观点是什么?有些算法可以更自然、更容易地用递归表示;但这意味着它们不会被执行……每次有人提到递归时,我们必须得到递归的建议吗?另请看,我要澄清的是,这里讨论的是堆栈内存,而不是一般的内存。即使这样,如果你在做尾部调用,并且在最近的CLR上运行,也可能没有什么不同。是的,我会给你一个向上的投票,但可能没有帮助,因为你没有说什么时候它会使问题变得更容易。此外,深度递归的问题通常不是堆栈增长过大并导致性能问题,而是堆栈溢出和程序失败?你显然从未用函数式语言编程过。也许他的意思是他永远不会使用递归…“没有其他方法可能是正确的?”这绝对是一个愚蠢的说法。我想不出一个可以用递归来解决的问题,这个问题也不能用迭代的方法来解决,这似乎有点极端。是否有任何问题只能通过递归来解决?我怀疑,如果你足够努力,足够有创造力,你总能找到另一个解决方案,不一定是高效的或可维护的。我们现在都在嘲笑,但将来某一天,我们都会吹嘘我们在开创性的计算机科学论文《递归被认为是有害的》的创始之作中@我投了反对票,因为我认为这是一个无聊的笑话,充其量也无济于事(最糟糕的是,对OP来说是冒犯)。@ChrisW:链接可能是在开玩笑,但我认为我的答案是一个完全恰当和准确的答案。我猜反对票是因为这是一个以前做过的笑话,它没有解决使用递归背后的实际性能问题。我不认为这是一个轻率的答案。这是一个对一个不可能的一般性问题的恰当的一般性回答。这个笑话不仅令人厌倦,而且已经僵化了。每个人都会在某个时候想到这个笑话。你可以认为Ada想到了这个笑话,只是想让genteel把它写在纸上。虽然递归很快就会爆发,如果它实际上是一个树结构而不是线性的。我认为你链接到了错误的树塔尔。试试这个:@apoorv020:不一定。记住,平衡二叉树的最大深度仅为节点数的logn,递归算法不需要比这更多的堆栈空间。@apoorv020:不一定。这取决于这棵树有多高。@apoorv020:实际上,许多树以簇的形式分叉,末端有很大的宽度,或者中间有很长的直线。比如说,考虑一个复杂网站的导航树。或者,如果您处理的是一些功能性更强的东西,其中可能会重复相当少的输入,那么在这一点上,备忘录可以为您节省时间。我几乎不认为这是反对使用递归的论点。每个环境对堆栈深度都有一定的限制。我已经编辑过了,谢谢。