java – 递归函数中堆栈溢出的原因

this video大约28分钟的时间里,学生要求Brian Harvey在编写程序时是否应该在递归过程中使用迭代过程.他说没有,因为

Your programs are not gonna run into space limitations. And in terms of locality of what’s in memory,you have to have a lot more control than you do over the way the program is interpreted to really affect that.

由于这不是一个计划课程,我以为他一般都在谈论编程语言.当他说“你的程序不会遇到空间限制.”,他是否忽略了堆栈溢出?我对他的答案感到困惑,因为没有堆栈溢出意味着你已经用完函数调用了空间?我对“地方性”部分一无所知.堆栈溢出可能发生在方案,java和其他语言中.我是正确的还是我误解了他的陈述?

最佳答案
您所指的视频是计算机科学讲座.计算机科学在很大程度上是理论性的,并且解决了许多与实用性无关的计算细节.在这种情况下,正如他在讲座开始时说的那样,今天的计算机体积庞大且足够快,性能很少成为问题.

内存位置与任何语言的StackOverflowExceptions无关.实际上,内存局部性指的是SRAM(静态RAM),它保存了当总线从内存中检索数据时可以带入的相邻数据的缓存(可以是磁盘或RAM).从此缓存中获取数据比从内存中获取数据要快,因此如果多个连续操作所需的所有数据都在缓存中,程序将运行得更快.

在这都是非常低级的.在大多数(如果不是全部)现代语言(如Java)的背后,有一个编译器正在进行许多低级优化.首先,这意味着您无法在低级别优化代码,尤其是在不干扰编译器优化的情况下.其次,(就像他在你所指的片段之后说的那样),除非你是一个资源密集型游戏,否则不值得花时间去担心性能(除非你有明显的性能问题,但更有可能表示代码中的其他问题).

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...