Stack 堆栈上的面试问题

Stack 堆栈上的面试问题,stack,Stack,最近我的朋友参加了intv,他面临着这个问题(intviewer根据我的朋友对另一个问题的回答编造了这个问题) 比如说,我们有两种选择 1) 递归-->使用系统堆栈,我认为操作系统会处理所有事情 2) 只对数据部分使用我们自己的堆栈并完成任务。 修理东西。你喜欢哪一个?为什么? 假设堆栈大小不会超过100。函数调用虽然本身并不慢,但确实需要非零时间。因此,迭代解决方案可以稍微快一点。我将使用系统堆栈。为什么要重新发明控制盘?通常情况下,简单性比轻微的性能提升要好得多 不要过度使用一个解决方案,如

最近我的朋友参加了intv,他面临着这个问题(intviewer根据我的朋友对另一个问题的回答编造了这个问题) 比如说,我们有两种选择 1) 递归-->使用系统堆栈,我认为操作系统会处理所有事情 2) 只对数据部分使用我们自己的堆栈并完成任务。 修理东西。你喜欢哪一个?为什么?
假设堆栈大小不会超过100。

函数调用虽然本身并不慢,但确实需要非零时间。因此,迭代解决方案可以稍微快一点。

我将使用系统堆栈。为什么要重新发明控制盘?

通常情况下,简单性比轻微的性能提升要好得多

不要过度使用一个解决方案,如果你不打算使用1ms,则可维护性/可读性会降低1ms

只要记住,无论你把什么聪明的小技巧放在一起,都必须得到维护(并首先证明它是有效的),因为有尽可能多的标准/系统解决方案可用,这已经被证明了。(请参见重塑车轮)


如果减少内存分配和提高性能真的是系统的关键,那么您就有了自己的工作,并准备花一些时间证明您的解决方案更好/更快、更稳定。

Hm,我认为这解决了问题

如果我明白你的意思的话,堆栈大小不仅仅是限制你使用其中一个的原因

但是想要使用递归。。。嗯,对于堆栈的长度来说,真的没有什么不好的,但我宁愿自己解决


尽可能避免递归。:)

递归可能是解决特定问题的最简单方法。迭代解决方案可能需要更多的代码和更多的出错机会。测试和维护成本可能大于性能效益。

在这里可以看到递归的一般偏好,一些人认为递归实现必然更清晰或更易于维护。。。也许,也许不是:-)

  • 递归通常避免显式循环
  • 递归有时可以简单地在函数中使用局部变量,以避免在计算结果时使用容器存储结果
  • 递归可以使反转子结果的收集顺序变得很简单
  • 递归意味着被处理的信息的深度是有限的,循环实现通常可以轻松避免这种情况,或者至少有更准确地反映数据处理需求的内存需求
    • 您希望软件的应用范围越广,消除任意限制就越重要(例如,UNIX软件,如现代vim、less、GNU grep等。对文件/行/表达式长度进行最小假设,并动态尝试任何要求的内容/这里的许多人都会记住旧编辑器和特定于供应商的实用程序,例如一个“天体”公司的grep永远不会匹配太长一行结束时的结果,编辑在长一行或文件上标记、关闭、损坏或减速为无用)
  • 简单的递归可能会导致子结果的组合效率极低
  • 有些人觉得递归更容易理解,有些人觉得它更难理解——显然它比其他人更适合我们思考一些问题的方式

我会选择第一种,使用系统堆栈。也就是说,第四种语言有两个系统堆栈。一个是返回堆栈,另一个是参数堆栈。这提供了一些很好的灵活性。

取决于算法。堆栈使用量小,系统堆栈。需要很多堆栈,放在堆上。堆栈大小受如果algo使用更多的堆栈空间,那么我将使用堆栈数据结构,并将数据推送到堆上

这与重新发明无关。我想他期待的是答案,从性能的角度来看。@user520959-性能只是一个考虑因素。除非面试官特别提到这是一个最重要的考虑因素,在这种情况下,我同意鲁巴耶特的观点too@user520959-面试官的问题是“哪种更快”?即便如此,您如何保证自己的解决方案比使用系统堆栈更快?递归并不坏。此外,它可以减少实现时间。这还取决于机器,如果上下文切换在该机器上需要10毫秒,那么您应该使用自己的堆栈