JavaScript实现一些算法

用JavaScript实现的一些算法


寻路算法

demo演示

image

算法原理

  • 首先计算出一个点下一步可走地址, 放到一个数组里保存起来
  • 过滤掉障碍点, 和已经走过的点
  • 利用估值函数算法f(n) = g(n) + h(n)计算出一个点到起始点和到终点和的最短距离
  • 并且把距离大小和上一步位置记录到对应的对象上, 方便后面绘制路径
  • 然后将结果从小到大重新排序, 获取下一步可走点
  • 然后递归循环计算路径
  • 当到达终点时, 开始绘制路径
  • 具体详情请看源代码

寻路算法源代码地址


行列式变换算法

demo演示

image

算法原理

  • 每个元素的索引位置对行的长度取模
  • 根据模的结果, 重新建立数组, 就能实现变换
  • 具体详情请看源代码

爱消除游戏源代码地址


八皇后问题

demo演示

image

算法原理

  • 递归计算是否在同行同列同斜线是否有其他皇后存在
  • 每次递归后, 要应用回溯的方法, 将棋盘恢复, 方面计算其他方法
  • 具体详情请看源代码

八皇后源代码地址


螺旋矩阵

demo演示

image

算法原理

  • 算法原理比较简单, 看代码就明白了
  • 具体详情请看源代码

螺旋矩阵源代码地址


排列和组合算法

算法原理

  • 排列: A(m, n) = m! / (m - n)!
  • 组合: C(m, n) = m! / n! * (m - n)!
  • 具体详情请看源代码

寻路算法

demo演示

image

算法原理

  • 首先计算出一个点下一步可走地址, 放到一个数组里保存起来
  • 过滤掉障碍点, 和已经走过的点
  • 利用估值函数算法f(n) = g(n) + h(n)计算出一个点到起始点和到终点和的最短距离
  • 并且把距离大小和上一步位置记录到对应的对象上, 方便后面绘制路径
  • 然后将结果从小到大重新排序, 获取下一步可走点
  • 然后递归循环计算路径
  • 当到达终点时, 开始绘制路径
  • 具体详情请看源代码

寻路算法源代码地址


行列式变换算法

demo演示

image

###算法原理

  • 每个元素的索引位置对行的长度取模
  • 根据模的结果, 重新建立数组, 就能实现变换
  • 具体详情请看源代码

爱消除游戏源代码地址


八皇后问题

demo演示

image

算法原理

  • 递归计算是否在同行同列同斜线是否有其他皇后存在
  • 每次递归后, 要应用回溯的方法, 将棋盘恢复, 方面计算其他方法
  • 具体详情请看源代码

八皇后源代码地址


螺旋矩阵

demo演示

image

###算法原理

  • 算法原理比较简单, 看代码就明白了
  • 具体详情请看源代码

螺旋矩阵源代码地址


技巧算法

  • 不使用第三个变量交换两个变量的值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var a = 5;
    var b = 8;
    //第一种
    a = a + b;
    b = a - b;
    a = a - b;

    //第二种
    a = a | b;
    b = a | b;
    a = a | b;

    //当a和b都不是数字的时候
    a = [a, b]
    b = a[0]
    a = a[1]
  • 不适用循环方法 输入 3 返回[1, 2, 3]数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    function test(num) {
    var arr = [];

    arr.push(num);
    if (-- num) {
    arr = test(num).concat(arr);
    }
    return arr
    }
    //利用闭包 公用一个arr
    function test(num) {
    var arr = [];

    return (function() {
    arr.unshift(num);
    if (-- num) {
    arguments.callee(num)
    }
    return arr;
    })()
    }
    //利用正则
    function test(num) {
    var arr = [];
    var resArr = [];
    arr.length = num + 1;
    var str = arr.join('a');
    str.replace(/a/g, function() {
    resArr.unshift(num --);
    })

    return resArr;
    }
  • 利用多种方式获取输入num 当大于100返回100 否则返回num

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function test(num) {
return num < 100 ? num : 100;
}

function test(num) {
switch(num < 100) {
case true:
return num
case false:
return 100;
}
}

function test(num) {

return Math.min(num, 100);
}

function test(num) {

var tmp = num > 100 && 100;
return tmp || num
}

function test(num) {

var tmp = num + '';
for (var i = 2; i < num.length && num > 0;) {
return 100
}
return num;
}

function test(num) {
var arr = [num, 100];
arr.sort(function(num1, num2) {
return num1 - num2;
})

return arr[0]
}

function test(num) {
var json = {foo: 'bar'}
var tmp = num > 100 || json;
for (var i in tmp) {
return 100
}
return num
}
  • 斐波那契算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function test(num) {
if (num <= 1) {
return 1;
}

return test(num - 1) + test(num - 2)
}

function test(num) {
var num1 = 1;
var num2 = 1;
var num3 = 0;

for (var i = 0; i < num -2; i ++) {
num3 = num1 + num2;
num1 = num2;
num2 = num3;
}

return num3
}

如果觉得不错, 记得点星哦, 谢谢啦. 大家的鼓励才是我继续努力的最大动力

转载请注明出处


斐波那契算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function test(num) {
if (num <= 1) {
return 1;
}

return test(num - 1) + test(num - 2)
}

function test(num) {
var num1 = 1;
var num2 = 1;
var num3 = 0;

for (var i = 0; i < num -2; i ++) {
num3 = num1 + num2;
num1 = num2;
num2 = num3;
}

return num3
}

技巧算法

  • 不使用第三个变量交换两个变量的值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var a = 5;
    var b = 8;
    //第一种
    a = a + b;
    b = a - b;
    a = a - b;

    //第二种
    a = a | b;
    b = a | b;
    a = a | b;

    //当a和b都不是数字的时候
    a = [a, b]
    b = a[0]
    a = a[1]
  • 不适用循环方法 输入 3 返回[1, 2, 3]数组

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    function test(num) {
    var arr = [];

    arr.push(num);
    if (-- num) {
    arr = test(num).concat(arr);
    }
    return arr
    }
    //利用闭包 公用一个arr
    function test(num) {
    var arr = [];

    return (function() {
    arr.unshift(num);
    if (-- num) {
    arguments.callee(num)
    }
    return arr;
    })()
    }
    //利用正则
    function test(num) {
    var arr = [];
    var resArr = [];
    arr.length = num + 1;
    var str = arr.join('a');
    str.replace(/a/g, function() {
    resArr.unshift(num --);
    })

    return resArr;
    }
  • 利用多种方式获取输入num 当大于100返回100 否则返回num

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
function test(num) {
return num < 100 ? num : 100;
}

function test(num) {
switch(num < 100) {
case true:
return num
case false:
return 100;
}
}

function test(num) {

return Math.min(num, 100);
}

function test(num) {

var tmp = num > 100 && 100;
return tmp || num
}

function test(num) {

var tmp = num + '';
for (var i = 2; i < num.length && num > 0;) {
return 100
}
return num;
}

function test(num) {
var arr = [num, 100];
arr.sort(function(num1, num2) {
return num1 - num2;
})

return arr[0]
}

function test(num) {
var json = {foo: 'bar'}
var tmp = num > 100 || json;
for (var i in tmp) {
return 100
}
return num
}

如果觉得不错, 记得点星哦, 谢谢啦. 大家的鼓励才是我继续努力的最大动力