Stack 堆栈上的面试问题
最近我的朋友参加了intv,他面临着这个问题(intviewer根据我的朋友对另一个问题的回答编造了这个问题) 比如说,我们有两种选择 1) 递归-->使用系统堆栈,我认为操作系统会处理所有事情 2) 只对数据部分使用我们自己的堆栈并完成任务。 修理东西。你喜欢哪一个?为什么?Stack 堆栈上的面试问题,stack,Stack,最近我的朋友参加了intv,他面临着这个问题(intviewer根据我的朋友对另一个问题的回答编造了这个问题) 比如说,我们有两种选择 1) 递归-->使用系统堆栈,我认为操作系统会处理所有事情 2) 只对数据部分使用我们自己的堆栈并完成任务。 修理东西。你喜欢哪一个?为什么? 假设堆栈大小不会超过100。函数调用虽然本身并不慢,但确实需要非零时间。因此,迭代解决方案可以稍微快一点。我将使用系统堆栈。为什么要重新发明控制盘?通常情况下,简单性比轻微的性能提升要好得多 不要过度使用一个解决方案,如
假设堆栈大小不会超过100。函数调用虽然本身并不慢,但确实需要非零时间。因此,迭代解决方案可以稍微快一点。我将使用系统堆栈。为什么要重新发明控制盘?通常情况下,简单性比轻微的性能提升要好得多 不要过度使用一个解决方案,如果你不打算使用1ms,则可维护性/可读性会降低1ms 只要记住,无论你把什么聪明的小技巧放在一起,都必须得到维护(并首先证明它是有效的),因为有尽可能多的标准/系统解决方案可用,这已经被证明了。(请参见重塑车轮)
如果减少内存分配和提高性能真的是系统的关键,那么您就有了自己的工作,并准备花一些时间证明您的解决方案更好/更快、更稳定。Hm,我认为这解决了问题 如果我明白你的意思的话,堆栈大小不仅仅是限制你使用其中一个的原因 但是想要使用递归。。。嗯,对于堆栈的长度来说,真的没有什么不好的,但我宁愿自己解决
尽可能避免递归。:) 递归可能是解决特定问题的最简单方法。迭代解决方案可能需要更多的代码和更多的出错机会。测试和维护成本可能大于性能效益。在这里可以看到递归的一般偏好,一些人认为递归实现必然更清晰或更易于维护。。。也许,也许不是:-)
- 递归通常避免显式循环
- 递归有时可以简单地在函数中使用局部变量,以避免在计算结果时使用容器存储结果
- 递归可以使反转子结果的收集顺序变得很简单
- 递归意味着被处理的信息的深度是有限的,循环实现通常可以轻松避免这种情况,或者至少有更准确地反映数据处理需求的内存需求
- 您希望软件的应用范围越广,消除任意限制就越重要(例如,UNIX软件,如现代vim、less、GNU grep等。对文件/行/表达式长度进行最小假设,并动态尝试任何要求的内容/这里的许多人都会记住旧编辑器和特定于供应商的实用程序,例如一个“天体”公司的grep永远不会匹配太长一行结束时的结果,编辑在长一行或文件上标记、关闭、损坏或减速为无用)
- 简单的递归可能会导致子结果的组合效率极低
- 有些人觉得递归更容易理解,有些人觉得它更难理解——显然它比其他人更适合我们思考一些问题的方式