递归是不是一般的坏习惯?

时间:2017-01-04 16:42:40

标签: recursion

我一直认为让你的代码在可避免的情况下不耐烦的事情被认为是糟糕的做法。递归似乎是这些事情中的一个(更不用说它可能导致堆栈溢出等问题),所以当我们在编程课程中必须学会认真对待它时我感到有些惊讶(因为它偶尔导致更短码)。在我看来,教授之间也存在分歧......

人们已经问过这个特定的语言(比如Python,评论将其与goto语句进行比较),主要针对一个问题,但我对一般情况感兴趣:

在现代编程中,递归是否被视为不良实践?我什么时候应该避免它,在任何情况下都可以避免它?

我发现的相关问题:

Is recursion a feature in and of itself?(不讨论是好还是坏)
Is recursion ever faster than looping?(答案描述递归可以导致函数式语言的改进,但在其他语言中却很昂贵),还有其他讨论性能的问题

1 个答案:

答案 0 :(得分:9)

递归编程并不是一种糟糕的做法。它是您工具箱中的一个工具,就像任何工具一样,它是唯一使用的工具,当坏事发生时。或者当它在适当的背景下使用时。

什么时候使用递归?你有一个树数据集,你需要执行相同的逻辑,这是一个很好的母鸡。例如:您有一个字符串元素的树列表,并且您希望计算所有字符串的总长度,一个分支。您定义了一个计算列表元素长度的方法,然后查看该元素是否有兄弟,如果它调用该方法,则传递兄弟 - 并且该过程重新开始。

最常见的陷阱是堆栈溢出。如果列表太大,则无法一次处理。所以你要实施检查以确保永远不会发生这种情况。例如将链表拆分为可管理的部分和功能,利用静态变量来跟踪您遍历的级别数 - 一旦超过该数量就会失败。

当数据集不是树类型数据集时,应避免使用。我唯一能想到你实际上无法避免使用递归的是在不支持循环的编程语言中(Haskell)。