看看SICP书和JS函数编程,我创建了两个递归函数。我的期望是,它们都会引发堆栈溢出错误。但是,只有sumAll()函数才会引发错误。请参见下面关于函数sumAll()和阶乘()的代码:
正如预期的那样,sumAll()函数确实引发堆栈溢出错误
function sumAll(n, i = 0, result = 0) {
return (i > n)
? result
: sumAll(n, i + 1, i + result);
}
console.log(sumAll(10000));
下面的阶乘()函数没有引发堆栈溢出错误:
functi
我是javascript和node.js的初学者,所以如果这个问题被认为太简单的话,请原谅我。
我想知道,如果我有一个函数返回一个允诺,并且在其解析()中,它在某种递归中再次调用相同的函数,这会不会导致堆栈溢出,以防它无法被解析?
你可以想象它如下所示:
var someVariable = await myFunction(someInput)
async function myFunction(myInputValue) {
return new Promise(function(resolve, reject) {
// do some computatio
我开始学习ocaml,并且真正体会到了递归在语言中的威力。然而,我担心的一件事是堆栈溢出。
如果ocaml使用堆栈进行函数调用,它最终不会溢出堆栈吗?例如,如果我有以下函数:
let rec sum x =
if x > 1 then f(x - 1) + x
else x;;
它最终一定会导致堆栈溢出。如果我在c++中做同样的事情(使用递归),我知道它会溢出。
所以我的问题是,有没有内置的保护措施来防止函数式语言溢出堆栈?如果不是,它们是不是像这样不太有用,因为上面的求和算法是用for循环的过程化风格编写的,可以处理任何数字(与整数溢出无关)?
给定具有无限递归的C程序:
int main() {
main();
return 0;
}
为什么这会导致堆栈溢出。我知道这会导致C++中的未定义行为来自下面的线程 (并且作为边节点,不能在C++中调用main() )。然而,val差尔告诉我,这会导致堆栈溢出:
Stack overflow in thread 1: can't grow stack to 0x7fe801ff8
最后,由于分段错误,程序结束:
==2907== Process terminating with default action of signal 11 (SIGSEGV)
==290
我发现了以下问题
如果数组列表太大,下面的递归代码将导致堆栈溢出。如何才能修复这一问题,同时仍然保留递归模式?
答案是:
通过修改nextListItem函数,可以避免潜在的堆栈溢出,如下所示:
var list = readHugeList();
var nextListItem = function() {
var item = list.pop();
if (item) {
// process the list item...
setTimeout( nextListItem, 0);
}
};
堆栈溢出被消
我试图通过来理解asm和堆栈溢出。正如我所理解的,常规堆栈溢出将堆栈边界之外的推入内存中。我的问题是,如果堆栈溢出超出了内存边界,会发生什么情况。
在模拟器中,如果您有一个具有以下代码的程序:
PUSH 53 ; 53 or 0x35 is opcode for PUSH
JMP 0 ; loop it
该程序覆盖自身,将堆栈推到RAM之外,堆栈指针指向-1。在一个真实的场景中,真正的程序会发生什么?
我使用来自Google CDN的JQuery,在第12行(对于min文件)和1076行(对于未压缩的文件),我得到了堆栈溢出错误(使用IE8)。堆栈溢出错误所在行的JQuery代码如下:
JQuery.js ...
makeArray: function( array ) {
var ret = [];
if( array != null ){
var i = array.length;
// The window, strings (and functions) also have 'length'
// @A
我读过一篇文章,声称foldl可能很容易发生堆栈溢出。发布示例代码为:
maximum [1..1000000]
代码不会在我的机器上溢出。但是,它可能会因环境而异。我像这样增加了数字:
maximum [1..1000000000]
它导致了硬盘交换,所以我不得不停止评估。示例代码并不重要。堆栈溢出真的发生了吗?或者仅仅是一个过去的故事?