【发布时间】:2016-03-22 23:45:08
【问题描述】:
在this video 大约 28 分钟的时候,Brian Harvey 被一个学生问到在编写程序时我们是否应该始终使用迭代过程而不是递归过程。他说不,因为
您的程序不会遇到空间限制。就内存中内容的局部性而言,您必须比您对程序被解释的方式有更多的控制才能真正影响它。
由于这不是一门课程,我假设他在这里一般谈论的是编程语言。当他说““你的程序不会遇到空间限制。”时,他是否忽略了堆栈溢出?我对他的回答感到困惑,因为没有堆栈溢出意味着你已经用函数调用耗尽了空间?而且我对“局部性”部分一无所知。堆栈溢出可能发生在方案、Java 和其他语言上。我是对的还是误解了他的说法?
【问题讨论】:
-
当然,栈溢出can happen in lisp,还有Java。
-
@azurefrog 已编辑,谢谢
-
局部性部分指的是内存局部性,它涉及值在内存中存储的接近程度。由于 CPU 缓存的工作方式,局部性通常会以极大的方式影响性能。不看有问题的剪辑,只阅读引用,我猜哈维所说的是,在任何一般意义上,你几乎无法控制内存局部性,尤其是在高级编程语言中,因此编写迭代算法而不是递归的确实不会影响这一点。
-
@morbidCode 是的。这通常是 99% 的算法的有效假设,除非您在堆栈大小特别受限的环境中工作。即使在像 Java 这样具有相当浅堆栈的语言中,对于无法简单地迭代表达的算法也不太可能溢出。在像 Scheme 这样的语言中,递归是一种常用工具,它就更不用担心了。如果它确实成为一个问题,你可以重构它,但他说这可能无关紧要,所以你应该首先编写代码尽可能清晰,这是非常好的建议。
-
我认为他想避免学生沉迷于优化。该课程处于非常早期的阶段,我的理解是他更看重简洁的代码而不是高性能的代码。所以他的意思是,他的学生必须编写的代码在空间要求方面非常有限,不会发生堆栈溢出。
标签: java recursion scheme iteration sicp