随机Fibonacci发生器

时间:2017-12-10 23:33:37

标签: javascript fibonacci

我正在尝试在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

2 个答案:

答案 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算法,可以像下面的代码一样改进代码。

&#13;
&#13;
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;
&#13;
&#13;

将结果与此网站进行比较 http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibtable.html