我正在研究深度优先搜索,他的递归版本实现起来非常简单。使用稍微复杂的实现,可以使用堆栈来实现非递归版本。
递归与非递归版本的优缺点是什么?在我的简单测试案例中,我看不出任何统计上显着的时序差异。
我能想到的一个问题是递归情况可能会导致堆栈溢出错误。那么有什么理由可以使用递归实现吗?
答案 0 :(得分:1)
你在学校看到很多递归DFS,但在编写软件的现实生活中,你应该从不使用递归,除非你知道它将被限制在合理的深度。
通常这意味着深度限制为O(log N),例如递归DFS在平衡树中很好,或者您从问题域中知道非常深的递归赢了&#39 ; t发生,例如在递归下降解析中递归到嵌套的语法级别。
堆栈溢出是一个灾难性的错误,所以如果你不确定深度是否有限,那么你应该做(小的,真的)额外的工作并在堆栈上编写迭代版本堆。