从索引中获取周期序列0,1,2,3,2,1,0,1 ...的最简单方法是什么?

时间:2015-07-29 07:23:13

标签: java algorithm math language-agnostic

例如,我有一个周期序列从0开始,然后是1,2,直到3,然后开始下降到2,1,然后是0,然后是1。让函数为f(min,max,x),其中x是索引,所以:

f(0,3,0)=0
f(0,3,1)=1
f(0,3,2)=2
f(0,3,3)=3
f(0,3,4)=2
.
.
.
f(0,3,9)=3

我尝试过类似的事情:

public static int f(int min,int max,int x){
    int r=min;
    int increment=1;
    for(int i=0;i<x;i++){
        if(r==max){
            increment=-1;
        }else if(r==min){
            increment=1;
        }
        r+=increment;
    }
    return r;
}

但是我觉得它很长很无效,有没有更简单的方法来实现f(min,max,x)?

或者只能通过一行来完成,例如int result =(some + - * /,mod,ternary operator ... to min,max,x)?

3 个答案:

答案 0 :(得分:2)

int f(int min, int max, int x) {
    const int len = (max - min) * 2;
    const int offset = (x + len - 1) % len;
    const int ans = (offset + 1) % len;
    return min + ans > max ? min + len - ans : min + ans;
}

检查live here

答案 1 :(得分:1)

作为明确公式的解决方案:

// note this doesn't work for negative values as expected
public static int f(int min,int max,int x) {
    return max-abs(x%((max-min)*2)-max+min)
}

// just add abs(x) to make it work for negative numbers
public static int f(int min,int max,int x) {
    return max-abs(abs(x)%((max-min)*2)-max+min)
}

答案 2 :(得分:0)

int index = x % (2*(max-min)); // take care of periodicity
int val = 0;
if(index <= max){ // first half cycle
   val = index
}else{  // second half cycle
   val = 2 * max - index
}
return min + val // add min

这个逻辑对于你想做的事情应该是正确的。