如何以编程方式识别n在这个序列中的位置?

时间:2011-10-28 22:15:02

标签: javascript math sequence

我有一个数字我想要符合以下序列中最接近的值:

2, 5, 9, 12, 15, 19, 22, 25, 29, 32, 35, 39, 42...

如果10通过,它将变为1213将变为1517将变为19

我如何在函数中处理它?<​​/ p>

3 个答案:

答案 0 :(得分: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]);
}

答案 1 :(得分:0)

这是一个jsFiddle,其解决方案适用于无限系列的组合“+ 3 + 4 + 3 + 3 + 4 + 3 + 3 + 4 + 3 + 3 + 4 ......”成为你的系列。 http://jsfiddle.net/9Gu9P/1/希望这会有所帮助!

更新:

在看了你的答案之后,我注意到你说你想要序列中的结束数字,但是你的例子都会转到序列中的下一个数字,无论它是最接近的还是没有比较前一个数字,所以这里是另一个有效的jsfiddle考虑到这一点,你可以选择你想要的那个:)。

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

答案 2 :(得分:0)