【发布时间】:2015-12-08 20:33:10
【问题描述】:
假设我们有一个递归蛮力函数。
(我特别想知道暴力函数,因为它们可以轻松地递归调用自己一百万次。)
比如这样:
function BruteForce(chars, min, max, prefix, stage) {
for (var i = 0, len = chars.length; i < len; i++) {
if (stage >= min-1)
console.log(prefix + chars[i])
if (stage < max-1)
BruteForce(chars, min, max, prefix + chars[i], stage+1)
}
}
BruteForce("abc", 1, 5, "", 0)
(现在考虑这个伪代码,因为我的问题不仅仅是关于 JavaScript。)
这样的函数不会用新参数填充堆栈直到溢出吗?
如果您在 C/C++ 等中执行类似的操作会发生什么?
调用约定重要吗?不同的调用约定能够如何处理这个问题?
为什么上面的 JavaScript 代码不会导致堆栈溢出?
【问题讨论】:
-
如果不小心,递归可能总是导致堆栈溢出(在使用堆栈进行函数调用的语言中)。
-
调用约定很重要是什么意思?
-
@therainmaker 我的意思是使用不同的调用约定会有什么不同。那么在堆栈溢出方面,一些调用约定会比其他调用约定做得更好吗?
-
我可以问一下,为什么是关闭/关闭投票?
标签: javascript c recursion stack calling-convention