下面,我想介紹一下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.php.cn)!