ฉันดู GitHub ของอาจารย์คนหนึ่งในช่วงสองวันที่ผ่านมาและรู้ว่าเขาสนใจอัลกอริทึมมากขึ้น หลังจากอ่านอัลกอริทึมขั้นตอนหนึ่งสำหรับการคำนวณตัวเลขฉันรู้สึกว่านี่เป็นเรื่องที่น่าสนใจเล็กน้อยดังนั้นฉันจึงรู้ได้ด้วยตัวเอง
คำอธิบายอัลกอริทึมและหลักการการใช้งาน
จากหมายเลขจำนวนเต็มนับจำนวนวิธีในการเคลื่อนย้ายสามารถบรรลุเป้าหมายเช่นหมายเลข 4 มีวิธีการย้ายต่อไปนี้
การคัดลอกรหัสมีดังนี้:
[1, 3]
[4]
[1, 1, 2]
[ยี่สิบสอง]
[1, 1, 1, 1]
ในความเป็นจริงข้อสรุปต่อไปนี้สามารถดึงผ่านชุดค่าผสมข้างต้น
1. รายการแรกรายการทั้งหมดคือชุดค่าผสมของ 1
2. การรวมกันของ 1 จากซ้ายไปขวา
3. พบดัชนี 1 ในรายการจากนั้นคำนวณค่า 2 รายการจากด้านซ้ายและการดำเนินการนี้ซ้ำ
4. ยกเว้นสถานการณ์ 1 และ 2
นี่คือสามฟังก์ชั่นเครื่องมือ:
การคัดลอกรหัสมีดังนี้:
// คำนวณค่าในอาร์เรย์
ฟังก์ชั่นคำนวณ (arg) {
return eval (arg.join ('+'));
-
// ส่งออกค่าของอาร์เรย์
ฟังก์ชั่นพิมพ์ (arg) {
สำหรับ (var i = 0; i <arg.length; i ++) {
console.log (arg [i]);
-
-
// ตรวจสอบว่าเป็นวิธีที่ถูกหรือผิด
ฟังก์ชั่น hasrepeat (src, dist) {
if (dist.length! = 2) ส่งคืน false;
สำหรับ (var i = 0, len = src.length; i <len; i ++) {
if (dist.length == src [i] .length) {
ถ้า (dist [0] == src [i] [1]) {
กลับมาจริง;
-
-
-
กลับเท็จ;
-
ต่อไปนี้คือการใช้อัลกอริทึม:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น countsteps (n) {
var counts = 0, i, j = 0;
var result = [];
var newResult = [];
var source = [];
var temparg = [];
// สร้างอาร์เรย์ที่มีรายการทั้งหมด 1 รายการ
สำหรับ (i = 1; i <= n; i ++) {
source.push (1);
-
ถ้า (n> 2) {
สำหรับ (j = 1; j <n - 1; j ++) {
temparg.length = 0;
ถ้า (j <n - 1) {
// สร้างอาร์เรย์โดยเพิ่มขึ้น 1 ครั้งจากซ้ายไปขวา
// 1 .. 11 .. 111 ..
array.prototype.push.apply (temparg, source.slice (0, j));
temparg.push (คำนวณ (source.slice (j, n)));
result.push (temparg.slice (0));
// เนื้อหาในอาร์เรย์แบบเรียกซ้ำจนกว่าจะไม่มี 1 ในรายการ
รวม (temparg.slice (0));
-
-
-
// รวมรายการอาร์เรย์ที่มี 1
// 111-> 21-> 3
ฟังก์ชั่นรวม (arg) {
var linearg = [];
สำหรับ (var i = 0; i <arg.length; i ++) {
ถ้า (arg [i] == 1) {
ถ้า (i == 0 || i == 1) {
linearg.push (คำนวณ (arg.slice (0,2)));
array.prototype.push.apply (linearg, arg.slice (2, arg.length));
if (! hasrepeat (ผลลัพธ์, linearg)) {
result.push (linearg);
รวม (linearg.slice (0));
-
กลับ;
-
-
-
-
// เมื่อเป็น 2 มีมากกว่า 1
ถ้า (n == 2) {
result.push ([2]);
-
// เพิ่มทั้งหมด 1
result.push (แหล่งที่มา);
// เอาต์พุตทุกขั้นตอน
พิมพ์ (ผลลัพธ์);
console.log ('มี' ทั้งหมด: ' + result.length +' วิธีการเดิน ');
-
// วิ่ง
countsteps (4);
// ส่งออกเนื้อหาต่อไปนี้
-
[1, 3]
[4]
[1, 1, 2]
[ยี่สิบสอง]
[1, 1, 1, 1]
มีการเดินทั้งหมด 5 ประเภท
-
สรุป
อัลกอริทึมนี้สามารถนำไปใช้กับเกมบางประเภทได้ เมื่อระยะห่างระหว่างสองวัตถุมีความแน่นอนการประมวลผลที่เป็นไปได้ทั้งหมดสามารถทำได้และแน่นอนว่ามันสามารถนำไปใช้กับสถานที่อื่นได้ แม้ว่าวิศวกรส่วนหน้าส่วนใหญ่จะมีการปฏิบัติน้อยกว่าด้วยอัลกอริทึม แต่ก็ยังมีค่าอยู่ รายละเอียด UI จำนวนมากใช้อัลกอริทึมจริง ๆ ฉันจะโพสต์บทความเพิ่มเติมเกี่ยวกับอัลกอริทึมเมื่อฉันมีเวลา ทุกคนยินดีที่จะให้คำแนะนำที่มีค่าแก่ฉัน