【问题标题】:Random Fibonacci Generator随机斐波那契发生器
【发布时间】:2017-12-10 23:33:37
【问题描述】:

我正在尝试在 javascript 中创建一个简单的程序,其中斐波那契正方形可以通过随机数序列创建,但我似乎无法连接我的代码的两个部分。第一部分是:调用随机数,第二部分是计算斐波那契平方。

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

【问题讨论】:

  • 您将函数getRandomNum 分配给n,而不是调用该函数的返回值。写function getRandomNum() { ... }, var n = getRandomNum();
  • n 是一个函数 - 你没有调用 n

标签: javascript fibonacci


【解决方案1】:

除了不调用随机数生成器之外,您还使用了一个非常糟糕的优化算法。如果您仔细考虑所有需要进行的冗余调用,您就会明白为什么会达到堆栈限制。

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));

【讨论】:

  • 非常感谢!
【解决方案2】:

由于你不调用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?


因此,您的代码可以通过采用记忆算法来改进,如下所示。

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()));

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

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2011-01-22
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2015-04-25
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
相关资源
最近更新 更多