关于算法:Fibonacci序列JavaScript的第N个值(超时错误)

Nth Value of Fibonacci Sequence JavaScript (timeout error)

我有这个kata的有效解决方案(查找fibonacci序列的第n个值),但是我一直得到一个超时错误。有人能就如何重构它以更有效地运行提供建议吗?事先谢谢!

以下是描述链接-https://www.codewars.com/kata/simple-fun-number-395-fibonacci-digit-sequence/train/javascript

You are given three non negative integers a, b and n, and making an infinite sequence just like fibonacci sequence, use the following rules:

step1: use ab as the initial sequence.
step2: calculate the sum of the
last two digits of the sequence, and append it to the end of sequence.
repeat step2
Your task is to complete function find.
Return nth digit(0-based) of the sequence.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function find(a,b,n){
  let start = ("" + a + b);
  let next = a + b;
  let seq = start + next;
 
  while (seq.length <= n) {
    seq += (parseInt(seq[seq.length-2]) + parseInt(seq[seq.length-1]));
  }
  return parseInt(seq[n]);
}

console.log(find(7,8,9))

// should return 5


首先。…不要使用字符串,不要使用parseInt,不要同时保存整个序列。你只需要数字,你只需要最后两个数字。给定一个介于10和18之间的数字x(可能是两位数的最大和),它的十位数是1,它的一位数是x - 10。这将是一个显著的进步。

其次。…由于一个给定点后的整个序列是由该点的前两位数字1决定的,并且只有100个可能的两位数字序列,因此每个序列必须在200位以内重复;也就是说,在最多200位以内,它必须进入一个其从未出过的重复数字循环,其中该循环小于200位长。2因此,如果n大于几百,您可以通过找到这个循环的长度并"跳过"该长度的大倍数来大规模优化。

>1。事实上,这并不是书面上的事实。例如,序列69156&hellip;和79167&hellip;bot包含91个,但后面跟着不同的内容。这是因为"1"属于两位数,两位数都由前两位数决定。我不知道如何更好地表达这一点,但希望你明白我的意思。它不会影响整体论点,但在如何应用该观点时,您需要小心。>2。实际上要少得多;测试A和B的所有可能值,我发现序列总是进入循环并在25位之内完成第一次迭代!但我不知道如何严格地证明这个小得多的数字是正确的,除了详尽的测试;因此,以依赖它的方式编写代码可能是欺骗。


在转换和执行字符串操作时,通常速度较慢。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function nextVal(num){
    const last = (num%10);
    const lastButOne = (num - last)/10 % 10;
    const sum = last + lastButOne;
    return sum < 10 ? num * 10 + sum : num *100 + sum;
}
function find(a,b,n){
  let num = a * 10 + b;
  const above = Math.pow(10, n);// anything less than we don't have enough digits


  while (num < above) {
    num = nextVal(num);
  }
  return Number(`${num}`.charAt(n));
}

上面的代码依赖于数字检查,只将其转换为字符串(这也是可以避免的)