Skip to content

Commit a9b058c

Browse files
committed
add algorithm
1 parent f6662a8 commit a9b058c

File tree

1 file changed

+124
-0
lines changed

1 file changed

+124
-0
lines changed
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
---
2+
layout: post
3+
category : JavaScript
4+
tagline: ""
5+
tags : [算法]
6+
---
7+
{% include JB/setup %}
8+
9+
这两天看了下某位大神的github,知道他对算法比较感兴趣,看了其中的一个计算数字的步数算法,感觉这个有点意思,所以就自己实现了一个
10+
11+
### 算法描述与实现原理
12+
13+
给出一个整型数字,统计出有多少种走法可以到达目标,比如一个数字`4`,可以有下面几种走法
14+
15+
```html
16+
17+
[ 1, 3 ]
18+
[ 4 ]
19+
[ 1, 1, 2 ]
20+
[ 2, 2 ]
21+
[ 1, 1, 1, 1 ]
22+
23+
```
24+
其实通过上面的组合可以得出下面的结论
25+
26+
* 先列出所有项是1的组合
27+
28+
* 依次从左到右项为1的组合
29+
30+
* 递归上面的集合,找出项里1的索引,然后计算左起2项的值,结果递归此操作
31+
32+
* 排队1和2的情况
33+
34+
下面先提供两个工具函数
35+
36+
```js
37+
38+
// 计算数组内的值
39+
function calculate(arg){
40+
return eval(arg.join('+'));
41+
}
42+
43+
// 输出数组的值
44+
function print(arg){
45+
for(var i = 0; i < arg.length; i++){
46+
console.log(arg[i]);
47+
}
48+
}
49+
50+
```
51+
52+
下面贴出算法的实现
53+
54+
```js
55+
function countSteps(n){
56+
var counts = 0,i,j = 0;
57+
var result = [];
58+
var newresult = [];
59+
var source = [];
60+
var temparg = [];
61+
// 生成项全为1的数组
62+
for(i = 1; i <= n ; i++){
63+
source.push(1);
64+
}
65+
if(n > 2){
66+
for(j = 1; j < n - 1; j++){
67+
temparg.length = 0;
68+
if(j < n - 1){
69+
// 生成从左到右项为1递增的数组
70+
// 1.. 11.. 111..
71+
Array.prototype.push.apply(temparg, source.slice(0, j));
72+
temparg.push(calculate(source.slice(j,n)));
73+
result.push(temparg.slice(0));
74+
// 递归数组里的内容,直到项里没有1为止
75+
combine(temparg.slice(0));
76+
}
77+
}
78+
}
79+
// 组合包含1的数组项
80+
// 111->21->3
81+
function combine(arg){
82+
var linearg = [];
83+
for(var i = 0; i < arg.length; i++){
84+
if(arg[i] == 1){
85+
if(i ==0 || i == 1){
86+
linearg.push(calculate(arg.slice(0,2)));
87+
Array.prototype.push.apply(linearg, arg.slice(2, arg.length));
88+
result.push(linearg);
89+
js1(linearg.slice(0));
90+
return;
91+
}
92+
93+
}
94+
}
95+
}
96+
//为2的时候比1要多一项
97+
if(n == 2){
98+
result.push([2]);
99+
}
100+
// 添加全为1的情况
101+
result.push(source);
102+
// 输出所有步
103+
print(result);
104+
console.log('总共有:' + result.length + '种走法');
105+
}
106+
107+
// 运行
108+
countSteps(4);
109+
110+
// 输出下面内容
111+
/*
112+
[ 1, 3 ]
113+
[ 4 ]
114+
[ 1, 1, 2 ]
115+
[ 2, 2 ]
116+
[ 1, 1, 1, 1 ]
117+
总共有:5种走
118+
*/
119+
120+
```
121+
122+
### 总结
123+
124+
这个算法其实可以应用到某类游戏中去,当两个物体之前的距离一定的话,对所有的可能进行业务处理,当然也可以应用到别的地方,虽然大部分前端工程师对算法的实践比较少,不过它还是有存在的价值的,很多UI细节方面其实都运用了算法,以后有空还会贴更多关于算法相关的文章,欢迎大家多提些宝贵意见.

0 commit comments

Comments
 (0)