一、穷举 通过穷举所有的组合,得出结论,🌰:
var enumeratingAlgorithm = (head, foot ) => { let j; for (let i = 0 ; i <= head; i++) { j = head - i; if (i * 2 + j * 4 === foot) { console .log ("鸡的个数为[ %d ]只,兔子的个数为[ %d ]只。" , i, j); return ; } } }; enumeratingAlgorithm (35 , 94 );
二、递推 通过前面的子集推出最终的结论, 🌰:
var recursiveDeduceAlgorithm = (month ) => { let f1, f2; if (month === 1 || month === 2 ) { return 1 ; } f1 = recursiveDeduceAlgorithm (month - 1 ); f2 = recursiveDeduceAlgorithm (month - 2 ); return f1 + f2; }; const month = 12 ;const num = recursiveDeduceAlgorithm (month);console .log ("经过 [%d] 个月,共有 [%d] 对兔子。" , month, num);
三、递归 函数自己调用自己,直到满足基准条件方停止, 🌰:
var recursiveAlgorithm = (n ) => { if (n <= 1 ) { return 1 ; } return n * recursiveAlgorithm (n - 1 ); }; const n = 8 ;const result = recursiveAlgorithm (n);console .log ("%d 的阶乘为: %d" , n, result);
四、分治 把大问题分解为多个子问题,根据各子问题的解得出大问题的解, 🌰:
var findMedianSortedArrays = function (nums1, nums2 ) { const merged = []; let i = 0 ; let j = 0 ; const [lenA, lenB] = [nums1.length , nums2.length ]; while (i < lenA && j < lenB) { if (nums1[i] < nums2[j]) { merged.push (nums1[i]); i++; } else { merged.push (nums2[j]); j++; } } while (i < lenA) { merged.push (nums1[i]); i++; } while (j < lenB) { merged.push (nums2[j]); j++; } const { length } = merged; return length % 2 === 1 ? merged[Math .floor (length / 2 )] : (merged[length / 2 ] + merged[length / 2 - 1 ]) / 2 ; }; const test = [ [[1 , 3 ], [2 ]], [ [1 , 2 ], [3 , 4 ], ], ]; test.forEach ((ele ) => { const res = findMedianSortedArrays (ele[0 ], ele[1 ]); console .log (res); });
五、概率 概率算法依照概率统计的思路来求解问题, 求出的是近似解,常见概率算法有:
(1) 数值概率算法
(2) 蒙特卡罗(Monte Carlo)算法
(3) 拉斯维加斯(Las Vegas)算法
(4) 舍伍德(Sherwood)算法
🌰
var monteCarloPI = (n ) => { let PI ; let valid = 0 ; for (let i = 0 ; i < n; i++) { let x = Math .random (); let y = Math .random (); if (x * x + y * y <= 1 ) { valid++; } } PI = (4.0 * valid) / n; console .log ("撒点数:%d,有效点数%d,圆周率π ≈ %f\n" , n, valid, PI ); }; for (let i = 500000 ; i < 800000 ; i += 50000 ) { monteCarloPI (i); }
参考文章:
常用算法指南(一)基本算法思想