js算法模板
本篇初衷写于javascript期末考试,但也总结一些算法当成一篇博客。适用于有其他编程语言基础但是想快速入门js的人看。
排序
// 冒泡排序降序
function bubbleSort(array) {
for (let i = array.length - 1; i >= 1; i--) {
for (let j = 1; j <= i; j++) {
if (array[j] > array[j - 1]) {
let temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
return array;
}
斐波那契数列 提前构造数组
let arr = [0, 1];
function getLast(arr) {
return arr[arr.length - 1];
}
function getLastLast(arr) {
return arr[arr.length - 2];
}
for (let i = 0; i < 1000; i++) {
arr.push(getLast(arr) + getLastLast(arr));
}
// 获取斐波那契数列第n项
function feiN(n) {
if (n <= 1) {
return 0 // 第一项是0
}
if (n === 2) {
return 1 // 第二项是1
}
return feiN(n - 1) + feiN(n - 2);
}
质数
// 判断质数
function isPrime(n) {
if (n <= 1) {
return false;
}
// 优化了一下复杂度
for (let i = 2; i < Math.floor(Math.sqrt(n)) + 1; i++) {
if (n % i === 0) {
return false;
}
}
return true;
}
阶乘
function jie(n) {
return n === 1 ? 1 : n * jie(n - 1);
}
幂次
// n 的 +m 次方
function pow(n, m) {
if (m === 0) {
return 1;
}
let res = n;
for (let i = 1; i < m; i++) {
res *= n;
}
return res;
}
获取某一位
/**
* 获取一个数从右往左侧
* @param number
* @param w 如果是1,就是取个位数
*/
function getWei(number, w) {
function pow(n, m) {
if (m === 0) {
return 1;
}
let res = n;
for (let i = 1; i < m; i++) {
res *= n;
}
return res;
}
return Math.floor((number % (pow(10, w))) / pow(10, (w - 1)));
}
绝对值
// 绝对值也自己手动实现
function abs(n, m) {
if (m > n) {
return m - n;
} else {
return n - m;
}
}
随机
// 从数组中随机取出一个元素
function choice(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
// 随机小数范围
function uniform(left, right) {
return Math.random() * (right - left) + left;
}
// [left, right] 随机整数
function randint(left, right) {
return Math.floor(Math.random() * (right - left + 1) + left);
}
汉诺塔
function hanno(n, a, b, c) {
if (n === 1) {
console.log(a, "=>", c);
} else {
hanno(n - 1, a, c, b);
console.log(a, "=>", c);
hanno(n - 1, b, a, c);
}
}
hanno(3, "a", "b", "c");