Saya melihat github seorang master tertentu dalam dua hari terakhir dan tahu bahwa dia lebih tertarik pada algoritma. Setelah membaca salah satu algoritma langkah untuk menghitung angka, saya merasa ini agak menarik, jadi saya menyadari satu sendiri.
Deskripsi Algoritma dan Prinsip Implementasi
Diberi nomor integer, hitung berapa banyak cara untuk pindah dapat mencapai tujuan, seperti angka 4, ada cara berikut untuk pindah
Salinan kode adalah sebagai berikut:
[1, 3]
[4]
[1, 1, 2]
[dua puluh dua]
[1, 1, 1, 1]
Bahkan, kesimpulan berikut dapat ditarik melalui kombinasi di atas.
1. Daftar Pertama Semua item adalah kombinasi 1
2. Kombinasi 1 dari kiri ke kanan
3. Secara rekursif menemukan indeks 1 dalam item, dan kemudian menghitung nilai 2 item dari kiri, dan secara rekursif operasi ini
4. Kecualikan situasi 1 dan 2
Berikut adalah tiga fungsi alat:
Salinan kode adalah sebagai berikut:
// Hitung nilai dalam array
fungsi menghitung (arg) {
return eval (arg.join ('+'));
}
// output nilai array
fungsi cetak (arg) {
untuk (var i = 0; i <arg.length; i ++) {
console.log (arg [i]);
}
}
// Periksa apakah itu cara yang benar atau salah
function hasRePeat (src, dist) {
if (dist.length! = 2) return false;
untuk (var i = 0, len = src.length; i <len; i ++) {
if (dist.length == src [i] .length) {
if (dist [0] == src [i] [1]) {
Kembali Benar;
}
}
}
mengembalikan false;
}
Berikut ini adalah implementasi algoritma:
Salinan kode adalah sebagai berikut:
fungsi Countsteps (n) {
var counts = 0, i, j = 0;
var result = [];
var newResult = [];
var source = [];
var tempPARG = [];
// menghasilkan array dengan semua item 1
untuk (i = 1; i <= n; i ++) {
Source.push (1);
}
if (n> 2) {
untuk (j = 1; j <n - 1; j ++) {
TempPArg.length = 0;
if (j <n - 1) {
// menghasilkan array dengan 1 kenaikan dari kiri ke kanan
// 1 .. 11 .. 111 ..
Array.prototype.push.Apply (TempPARG, Source.slice (0, j));
TempPAr.push (Hitung (Source.Slice (J, N)));
result.push (TemppAR.Slice (0));
// Isi dalam array rekursif sampai tidak ada 1 dalam item
gabungkan (TemppAr.slice (0));
}
}
}
// Gabungkan item array yang berisi 1
// 111-> 21-> 3
fungsi gabungan (arg) {
var linearg = [];
untuk (var i = 0; i <arg.length; i ++) {
if (arg [i] == 1) {
if (i == 0 || i == 1) {
linearg.push (Hitung (arg.slice (0,2)));
Array.prototype.push.Apply (linearg, arg.slice (2, arg.length));
if (! hasrePeat (hasil, linearg)) {
result.push (linearg);
gabungkan (linearg.slice (0));
}
kembali;
}
}
}
}
// Saat 2, ada lebih dari 1
if (n == 2) {
result.push ([2]);
}
// tambahkan semua 1
result.push (sumber);
// output semua langkah
cetak (hasil);
console.log ('ada' total: ' + hasil.
}
// Berlari
Countsteps (4);
// keluarkan konten berikut
/*
[1, 3]
[4]
[1, 1, 2]
[dua puluh dua]
[1, 1, 1, 1]
Ada 5 jenis berjalan total
*/
Meringkaskan
Algoritma ini sebenarnya dapat diterapkan pada jenis game tertentu. Ketika jarak antara dua objek pasti, semua pemrosesan yang mungkin dapat dilakukan, dan tentu saja itu juga dapat diterapkan ke tempat lain. Meskipun sebagian besar insinyur front-end memiliki lebih sedikit praktik dengan algoritma, ia masih memiliki nilai. Banyak detail UI sebenarnya menggunakan algoritma. Saya akan memposting lebih banyak artikel tentang algoritma ketika saya punya waktu. Semua orang dipersilakan untuk memberi saya beberapa saran yang berharga.