#javascript #math #sequence
#javascript #математика #последовательность
Вопрос:
У меня есть число, которое я хочу соответствовать ближайшему значению в следующей последовательности:
2, 5, 9, 12, 15, 19, 22, 25, 29, 32, 35, 39, 42...
Если 10
передано, оно станет 12
, 13
станет 15
, 17
станет 19
.
Как бы я подошел к этому в функции?
Комментарии:
1. Я надеюсь, что это на самом деле не совсем очевидно, но… какова последовательность? Это просто массив?
2. Это не массив, я просто хочу привести число в соответствие с функцией последовательности.
3.
17
настолько близко15
, насколько это возможно19
, так что это как-то неоднозначно — и10
ближе9
, чем к12
, или я что-то упускаю?4. @LeviMcCallum: Итак … что такое функция последовательности? На данный момент я опубликовал общее решение, предполагая
f(x)
, что оно растет по мереx
роста.5. @schnaader Извиняется, первый — плохой пример. Однако последнее, поскольку оно уже находится в следующем кратном 10, необходимо округлить до следующего наибольшего значения.
Ответ №1:
Если вы не знаете, отсортирован ли массив, вы можете использовать подобный код, чтобы найти значение в массиве, которое ближе всего к переданному значению (выше или ниже):
var list = [2, 5, 9, 12, 15, 19, 22, 25, 29, 32, 35, 39, 42];
function findClosestValue(n, list) {
var delta, index, test;
for (var i = 0, len = list.length; i < len; i ) {
test = Math.abs(list[i] - n);
if ((delta === undefined) || (test < delta)) {
delta = test;
index = i;
}
}
return(list[index]);
}
Если вы хотите получить ближайшее число без перехода и отсортировать массив, вы можете использовать этот код:
var list = [2, 5, 9, 12, 15, 19, 22, 25, 29, 32, 35, 39, 42];
function findClosestValue(n, list) {
var delta, index;
for (var i = 0, len = list.length; i < len; i ) {
delta = n - list[i];
if (delta < 0) {
return(index ? list[index] : undefined);
}
index = i;
}
return(list[index]);
}
Ответ №2:
Вот jsFiddle с решением, которое работает для бесконечной серии комбинации » 3 4 3 3 4 3 3 4 3 3 4…..» это, кажется, ваша серия. http://jsfiddle.net/9Gu9P/1 / Надеюсь, это поможет!
Обновить:
Посмотрев на ваш ответ, я заметил, что вы говорите, что вам нужен номер closes в последовательности, но все ваши примеры переходят к следующему номеру в последовательности, независимо от того, является ли он ближайшим или нет по сравнению с предыдущим номером. итак, вот еще один jsfiddle, который работает с учетом этого, чтобы вы могли выбрать, какой из них вы хотите:).
Ответ №3:
function nextInSequence(x){
//sequence=2, 5, 9, 12, 15, 19, 22, 25, 29, 32, 35, 39, 42
var i= x%10;
switch(i){
case 2:case 5:case 9: return x;
case 0:case 1: return x 2-i;
case 3:case 4: return x 5-i;
default: return x 9-i;
}
}
предупреждение (nextInSequence(10))