JavaScript實現(xiàn)的一個計算數(shù)字步數(shù)的算法分享
這兩天看了下某位大神的github,知道他對算法比較感興趣,看了其中的一個計算數(shù)字的步數(shù)算法,感覺這個有點(diǎn)意思,所以就自己實現(xiàn)了一個。
算法描述與實現(xiàn)原理
給出一個整型數(shù)字,統(tǒng)計出有多少種走法可以到達(dá)目標(biāo),比如一個數(shù)字4,可以有下面幾種走法
[ 1, 3 ]
[ 4 ]
[ 1, 1, 2 ]
[ 2, 2 ]
[ 1, 1, 1, 1 ]
其實通過上面的組合可以得出下面的結(jié)論。
1.先列出所有項是1的組合
2.依次從左到右項為1的組合
3.遞歸上面的集合,找出項里1的索引,然后計算左起2項的值,結(jié)果遞歸此操作
4.排除1和2的情況
下面先提供三個工具函數(shù):
// 計算數(shù)組內(nèi)的值
function calculate(arg){
return eval(arg.join('+'));
}
// 輸出數(shù)組的值
function print(arg){
for(var i = 0; i < arg.length; i++){
console.log(arg[i]);
}
}
// 檢查是否是正反的走法
function hasRepeat(src, dist){
if (dist.length != 2) return false;
for(var i = 0, len = src.length; i < len ; i++){
if(dist.length == src[i].length){
if(dist[0] == src[i][1]){
return true;
}
}
}
return false;
}
下面貼出算法的實現(xiàn):
function countSteps(n){
var counts = 0,i,j = 0;
var result = [];
var newresult = [];
var source = [];
var temparg = [];
// 生成項全為1的數(shù)組
for(i = 1; i <= n ; i++){
source.push(1);
}
if(n > 2){
for(j = 1; j < n - 1; j++){
temparg.length = 0;
if(j < n - 1){
// 生成從左到右項為1遞增的數(shù)組
// 1.. 11.. 111..
Array.prototype.push.apply(temparg, source.slice(0, j));
temparg.push(calculate(source.slice(j,n)));
result.push(temparg.slice(0));
// 遞歸數(shù)組里的內(nèi)容,直到項里沒有1為止
combine(temparg.slice(0));
}
}
}
// 組合包含1的數(shù)組項
// 111->21->3
function combine(arg){
var linearg = [];
for(var i = 0; i < arg.length; i++){
if(arg[i] == 1){
if(i ==0 || i == 1){
linearg.push(calculate(arg.slice(0,2)));
Array.prototype.push.apply(linearg, arg.slice(2, arg.length));
if(!hasRepeat(result, linearg)){
result.push(linearg);
combine(linearg.slice(0));
}
return;
}
}
}
}
//為2的時候比1要多一項
if(n == 2){
result.push([2]);
}
// 添加全為1的情況
result.push(source);
// 輸出所有步
print(result);
console.log('總共有:' + result.length + '種走法');
}
// 運(yùn)行
countSteps(4);
// 輸出下面內(nèi)容
/*
[ 1, 3 ]
[ 4 ]
[ 1, 1, 2 ]
[ 2, 2 ]
[ 1, 1, 1, 1 ]
總共有:5種走
*/
總結(jié)
這個算法其實可以應(yīng)用到某類游戲中去,當(dāng)兩個物體之前的距離一定的話,對所有的可能進(jìn)行業(yè)務(wù)處理,當(dāng)然也可以應(yīng)用到別的地方,雖然大部分前端工程師對算法的實踐比較少,不過它還是有存在的價值的,很多UI細(xì)節(jié)方面其實都運(yùn)用了算法,以后有空還會貼更多關(guān)于算法相關(guān)的文章,歡迎大家多提些寶貴意見.
- JS使用Dijkstra算法求解最短路徑
- javascript算法題 求任意一個1-9位不重復(fù)的N位數(shù)在該組合中的大小排列序號
- javascript算法題:求任意一個1-9位不重復(fù)的N位數(shù)在該組合中的大小排列序號
- JavaScript求一組數(shù)的最小公倍數(shù)和最大公約數(shù)常用算法詳解【面向?qū)ο螅貧w迭代和循環(huán)】
- javascript使用遞歸算法求兩個數(shù)字組合功能示例
- JavaScript實現(xiàn)數(shù)組全排列、去重及求最大值算法示例
- javascript中解析四則運(yùn)算表達(dá)式的算法和示例
- JS使用Prim算法和Kruskal算法實現(xiàn)最小生成樹
- JS實現(xiàn)計算小于非負(fù)數(shù)n的素數(shù)的數(shù)量算法示例
- JavaScript采用遞歸算法計算階乘實例
- JS求解兩數(shù)之和算法詳解
相關(guān)文章
數(shù)據(jù)分析軟件之FineReport教程:[5]參數(shù)界面JS(全)
表格軟件FineReport在設(shè)計報表時經(jīng)常會用到,這篇文章主要介紹數(shù)據(jù)分析軟件之FineReport教程:[5]參數(shù)界面JS,需要的朋友可以參考下2015-08-08
基于d3.js/neovis.js/neod3.js實現(xiàn)鏈接neo4j圖形數(shù)據(jù)庫的圖像化顯示功能
neovis.js?由vis.js支持的圖形可視化以及來自Neo4j的數(shù)據(jù)。這篇文章主要介紹了基于d3.js/neovis.js/neod3.js實現(xiàn)鏈接neo4j圖形數(shù)據(jù)庫的圖像化顯示功能,需要的朋友可以參考下2022-02-02
TypeScript中交叉類型和聯(lián)合類型的區(qū)別詳解
聯(lián)合類型(Union Types)和交叉類型(Intersection Types)是 TypeScript 中的兩種高級類型,它們都用于組合多個類型并生成新的類型,但它們兩者之間的用法不一樣,本文小編就給大家講講TypeScript中交叉類型和聯(lián)合類型的區(qū)別,需要的朋友可以參考下2023-09-09
JavaScript開發(fā)中需要搞懂的字符編碼總結(jié)
字符集就是字符的集合,字符編碼則代表字符集的實際編碼規(guī)則,是用于計算機(jī)解析字符的。本文為大家整理了JavaScript開發(fā)中需要搞懂的字符編碼,希望對大家有所幫助2023-02-02

