Skip to content

Instantly share code, notes, and snippets.

@tangyangzhe
Created December 14, 2012 02:27
Show Gist options
  • Save tangyangzhe/4282047 to your computer and use it in GitHub Desktop.
Save tangyangzhe/4282047 to your computer and use it in GitHub Desktop.
js尾部调用堆栈溢出demo
function isEven(number) {
if (number === 0) {
return true;
}
else {
return isOdd(number - 1);
}
}
function isOdd(number) {
if (number === 0) {
return false;
}
else {
return isEven(number - 1);
}
}
isEven(100000); // InternalError: too much recursion
// 可以通过 蹦床(trampolines) 技巧来优化
function bounce(ret) {
while (typeof ret === 'function') {
ret = ret();
}
return ret;
}
function isEven(number) {
if (number === 0) {
return true;
}
else {
return function() {
return isOdd(number - 1);
};
}
}
function isOdd(number) {
if (number === 0) {
return false;
}
else {
return function() {
return isEven(number - 1);
};
}
}
bounce(function() {return isEven(100000);}); // true
// 通过 bounce 方式,在运行 isOdd(99999) 时,isEven(100000) 已经完成并从堆栈中退出了,因此不会造成溢出
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment