Как программно определить, где n будет соответствовать этой последовательности?

#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, который работает с учетом этого, чтобы вы могли выбрать, какой из них вы хотите:).

http://jsfiddle.net/9Gu9P/2/

Ответ №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))