数据结构与算法JavaScript版(三)

本文使用JavaScript实现一些常用的算法思想

算法思想

递归

1
2
3
4
5
6
7
8
//斐波那契数列:递归
function fibonacci(num) {
if (num===1||num===2) {
return 1;
}
return fibonacci(num-1)+fibonacci(num-2);
}

非递归

1
2
3
4
5
6
7
8
9
10
//斐波那契数列:非递归
function fib(num) {
var n1=1,n2=1,n=1;
for (var i = 3; i <= num; i++) {
n=n1+n2;
n1=n2;
n2=n;
}
return n;
}

动态规划

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
//动态规划:将大问题转化成小问题
//最少硬币找零问题:找到n所需的最小硬币数
function dpMinCoinChange(coins) {
var coins=coins;
var cache={};
this.makeChange=function (amount) {
var me=this;
if (!amount) {//判断为正
return [];
}
if (cache[amount]) {//判断是否有缓存
return cache[amount];
}
var min=[],newMin,newAmount;
for (var i = 0; i < coins.length; i++) {//对每个面额计算
var coin=coins[i];
newAmount=amount-coin;
if (newAmount>=0) {
newMin=me.makeChange(newAmount);
}
if (newAmount>=0 && (newMin.length<min.length-1 || !min.length)
&& (newMin.length || !newAmount)) {
//判断newAmount是否有效,最小硬币数是否最优,newMin和newAmount是否合理
min=[coin].concat(newMin);
console.log('new Min '+min+ ' for '+amount);
}
}
return (cache[amount]=min);
}
}

贪心策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//贪心算法:近似求解,通过局部最优达到全局最优
//最少硬币找零问题:找到n所需的最小硬币数
function txMinCoinChange(coins){
var coins=coins;
this.makeChange=function(amount){
var change=[],total=0;
for (var i = coins.length; i >= 0; i--) {//对每个面额从大面额开始,从大到小依次
var coin=coins[i];
while (total+coin<=amount) {
change.push(coin);
total+=coin;
}
}
return change;
}
}
-------------本文结束感谢您的阅读-------------

本文标题:数据结构与算法JavaScript版(三)

文章作者:Awebone

发布时间:2020年07月18日 - 15:07

最后更新:2020年07月18日 - 21:07

原始链接:https://www.awebone.com/posts/c0d60af6/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。