За последние два дня я посмотрел на 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 ('+'));
}
// Вывод значения массива
функция print (arg) {
for (var i = 0; i <arg.length; i ++) {
console.log (arg [i]);
}
}
// Проверьте, является ли это правильным или неправильным способом
функция hasrepeat (src, dist) {
if (dist.length! = 2) вернуть false;
for (var i = 0, len = src.length; i <len; i ++) {
if (dist.length == src [i] .length) {
if (dist [0] == src [i] [1]) {
вернуть истину;
}
}
}
вернуть ложь;
}
Ниже приводится реализация алгоритма:
Кода -копия выглядит следующим образом:
функции counteps (n) {
var counts = 0, i, j = 0;
var result = [];
var newresult = [];
var source = [];
var temparg = [];
// генерировать массив со всеми предметами 1
for (i = 1; i <= n; i ++) {
Source.push (1);
}
if (n> 2) {
for (j = 1; j <n - 1; j ++) {
temparg.length = 0;
if (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
Функция COMBINE (arg) {
var linearg = [];
for (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 (result, linearg)) {
result.push (linearg);
комбинация (linearg.slice (0));
}
возвращаться;
}
}
}
}
// Когда это 2, есть более 1
if (n == 2) {
result.push ([2]);
}
// Добавить все 1
result.push (источник);
// Вывод всех шагов
Печать (результат);
console.log («есть» в общей сложности: ' + result.length +' al walk ’);
}
// Бегать
CountSteps (4);
// Вывод следующего содержимого
/*
[1, 3]
[4]
[1, 1, 2]
[ двадцать два ]
[1, 1, 1, 1]
Всего есть 5 видов ходьбы
*/
Суммировать
Этот алгоритм может быть фактически применен к определенным типам игр. Когда расстояние между двумя объектами определена, может быть выполнена вся возможная обработка, и, конечно, оно также может быть применено к другим местам. Хотя большинство фронт-инженеров имеют меньше практики с алгоритмами, это все еще имеет ценность. Многие детали пользовательского интерфейса фактически используют алгоритмы. Я опубликую больше статей об алгоритмах, когда у меня будет время. Все могут дать мне несколько ценных предложений.