نظرت إلى github لسيد معين في اليومين الماضيين وعرفت أنه كان أكثر اهتماما بالخوارزميات. بعد قراءة إحدى خوارزميات الخطوة لحساب الأرقام ، شعرت أن هذا كان مثيرًا للاهتمام بعض الشيء ، لذلك أدركت بنفسي.
وصف الخوارزمية ومبدأ التنفيذ
بالنظر إلى رقم عدد صحيح ، احسب عدد الطرق للتحرك يمكن أن تصل إلى الهدف ، مثل الرقم 4 ، هناك الطرق التالية للتحرك
نسخة الكود كما يلي:
[1 ، 3]
[4]
[1 ، 1 ، 2]
[ إثنان وعشرون ]
[1 ، 1 ، 1 ، 1]
في الواقع ، يمكن استخلاص الاستنتاجات التالية من خلال المزيج أعلاه.
1. قائمة أولى جميع العناصر هي مجموعات من 1
2. مزيج من 1 من اليسار إلى اليمين
3. أوجد فهرس 1 في العنصر بشكل متكرر ، ثم احسب قيمة عنصرين من اليسار ، ومتكرر هذه العملية بشكل متكرر
4. استبعاد حالات 1 و 2
فيما يلي ثلاث وظائف للأدوات:
نسخة الكود كما يلي:
// احسب القيم الموجودة في الصفيف
وظيفة حساب (arg) {
إرجاع eval (arg.join ('+')) ؛
}
// إخراج قيمة الصفيف
وظيفة طباعة (arg) {
لـ (var i = 0 ؛ i <arg.length ؛ i ++) {
console.log (arg [i]) ؛
}
}
// تحقق مما إذا كان هذا هو الطريق الصحيح أو الخاطئ
وظيفة hasrepeat (src ، dist) {
if (dist.length! = 2) return false ؛
لـ (var i = 0 ، len = src.length ؛ i <len ؛ i ++) {
if (dist.length == src [i] .length) {
if (dist [0] == src [i] [1]) {
العودة صحيح.
}
}
}
العودة كاذبة
}
فيما يلي تطبيق الخوارزمية:
نسخة الكود كما يلي:
CONTSTEPS (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 ؛
if (j <n - 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 ++) {
if (arg [i] == 1) {
if (i == 0 || i == 1) {
linearg.push (حساب (arg.slice (0،2))) ؛
Array.Prototype.push.apply (LineArg ، Arg.Slice (2 ، Arg.Length)) ؛
if (! hasrepeat (النتيجة ، linearg)) {
النتيجة.
الجمع (linearg.slice (0)) ؛
}
يعود؛
}
}
}
}
// عندما يكون 2 ، هناك أكثر من 1
إذا (n == 2) {
النتيجة. push ([2]) ؛
}
// أضف كل 1
النتيجة. push (المصدر) ؛
// إخراج جميع الخطوات
طباعة (نتيجة) ؛
console.log ("هناك" في المجموع: " + result.length + طريقة المشي") ؛
}
// يجري
countsteps (4) ؛
// إخراج المحتوى التالي
/*
[1 ، 3]
[4]
[1 ، 1 ، 2]
[ إثنان وعشرون ]
[1 ، 1 ، 1 ، 1]
هناك 5 أنواع من المشي في المجموع
*/
لخص
يمكن تطبيق هذه الخوارزمية بالفعل على أنواع معينة من الألعاب. عندما تكون المسافة بين كائنين مؤكدين ، يمكن إجراء جميع المعالجة الممكنة ، وبالطبع يمكن أيضًا تطبيقها على أماكن أخرى. على الرغم من أن معظم المهندسين الأماميين لديهم ممارسات أقل مع الخوارزميات ، إلا أنها لا تزال ذات قيمة. العديد من تفاصيل واجهة المستخدم تستخدم بالفعل الخوارزميات. سأقوم بنشر المزيد من المقالات حول الخوارزميات عندما يكون لدي الوقت. الجميع مرحب بهم لإعطائي بعض الاقتراحات القيمة.