下面,我想介绍一下Fibonacci(斐波那契数列)的大兄弟,Tribonacci数列。
正如它的名字所暗示的那样,它和斐波那契数列方式很相像,但又有不同的地方。
如果我们用[1,1,1]开始这个数列,我们将得到如下的结果:
[1,1,1,3,5,9,17,31,...]
大家可以看到,第四项3是第一、二、三项之和,第五项5是第二、三、四项之和,以此类推......
那如果用[0,0,1]开始这个数列,会得到怎样的结果呢?
[0,0,1,1,2,4,7,13,24,...]
看了这个例子,你大概已经猜出了规律:除了用作初始序列的前三个数字,以后的每一个数字都是等于它前面最近的三个数字之和。
再对比斐波那契数列,规律是:除了用作初始序列的前两个数字,以后的每一个数字都是等于它前面最近的两个数字之和。
现在,你明白为啥我说它俩是兄弟了吧?
甚至,按照这样的规律,还可以引申为Xbonacci数列,不过这个题目我只聊聊Tribonacci数列。
好了,想想怎么实现一个构造Tribonacci数列的方法吧!
它接收两个参数,第一个参数作为初始化序列,是个数组。第二个参数是数字,表示要生成多少项数列。
返回值,自然是生成了新项后的数列数组。
对于这个问题,要区分两种情况:
第一种,这个初始化序列如果大小为3,但我只要生成2项该怎么办?答案很简单,直接对初始化数组截取前2项,就OK。
第二种情况,要求生成初始化序列之外的项,也很简单,像生成斐波那契数列一样,一个循环,新项由前面最近三项相加构成,以此类推。
function tribonacci(signature,n){
var startPoint = 0;
if(n < signature.length){
return signature.slice(0,n);
}
for(var i=startPoint+signature.length;i<n;i++){
signature[i] = signature[startPoint] + signature[startPoint+1] + signature[startPoint+2];
startPoint++;
}
return signature;
}
以上就是 JavaScript趣题:Tribonacci数列的内容,更多相关内容请关注PHP中文网(www.gxlcms.com)!