我正在尝试在javascript中创建一个简单的程序,其中Fibonacci square可以通过随机数序列创建,但我似乎无法连接我的代码的两个部分。第一个方面是:调用随机数,第二个方面:计算斐波纳契方阵。
var n = function getRandomNum() {
return Math.floor(Math.random()*100) +1;
}
function fib(x) {
if (x < 2) {
return x;
} else {
return fib(x - 1) + fib(x - 2);
}
}
console.log(fib(n));
告诉我哪里出错了。这些是我运行时遇到的错误。
RangeError: Maximum call stack size exceeded
at fib:7:13
at fib:11:12
at fib:11:12
at fib:11:12
at fib:11:12
at fib:11:12
答案 0 :(得分:0)
除了不调用随机数生成器之外,您使用的是非常优化的算法。如果您仔细考虑需要进行的所有冗余调用,您将看到为什么达到堆栈限制。
var n = function getRandomNum() {
return Math.floor(Math.random() * 100) + 1;
}(); // <-- quick inline invocation... not normally how you'd use this.
console.log(n);
function fib(x) {
function _fib(x, a, b) {
if (x < 2) {
return a;
}
return _fib(x - 1, b, a + b);
}
return _fib(x, 0, 1);
}
console.log(fib(n));
答案 1 :(得分:0)
由于您没有调用n
函数,因此您应该像下面这样调用它。
var n = function getRandomNum() {
return Math.floor(Math.random()*100) +1;
}
function fib(x) {
if (x < 2) {
return x;
} else {
return fib(x - 1) + fib(x - 2);
}
}
console.log(fib(n));
但是,代码中存在一个很大的问题,正如 @rock star 所提到的,代码中没有任何优化过程。这就是为什么你的代码导致内存泄漏问题的原因
为避免这种情况,您只需使用 memoization ,点击此链接即可获得任何线索。
Javascript Memoization Explanation?
因此,通过调整memoization算法,可以像下面的代码一样改进代码。
var n = function getRandomNum() {
return Math.floor(Math.random()*100) +1;
}
var result = [];
result[0] = 1;
result[1] = 1;
function fib(x) {
var ix, ixLen;
for(ix = 0, ixLen = x; ix < ixLen; ix++){
if(!result[ix]){
result[ix] = result[ix-2] + result[ix-1];
}
}
console.log('n:', x, ' result: ', result[ix-1]);
return result[ix-1];
}
console.log(fib(n()));
&#13;
将结果与此网站进行比较 http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html