在使用 Java(或任何其他程序语言)进行编程时,我经常在递归解决问题和迭代解决问题之间进行选择。递归选项通常比迭代解决方案更优雅,所以我通常选择递归解决方案。除了一个例外:
担心堆栈溢出如果最大堆栈深度与输入的大小成线性比例(或更糟),我倾向于避免递归解决方案。然而,我意识到在许多其他语言中(甚至是针对 JVM 的语言,例如 Scala 和 Clojure),许多算法(例如基本列表算法)通常以递归方式表示,其中最大堆栈深度与列表的长度成正比。(1)那么,我对线性堆栈深度算法中堆栈溢出的担忧是否合理?
TL;DR:什么“堆栈深度复杂度”被认为是合理的?对数复杂度,例如递归二分搜索,O(log N)肯定没问题,但是O(N),O(N log N),O(N 2 )怎么样?你通常会在哪里画线?(2)
(1) 我意识到这些语言有时支持 @tailrec 之类的东西,但这个问题涉及 Java、C# 等。
(2) 请注意,我不关心 CPU 开销等。只是堆栈深度。