如何将这些“ if”语句转换为算法

时间:2019-04-25 21:19:51

标签: javascript algorithm

我正在尝试将这些'if'语句转换为算法,以便我可以有更多的阶段而不是被限制为10。如何转换它?我只是无法绕开逻辑!

function getStage(km) { 
    if (km > 2 && km < 4){
        return 1;
    }
    else if (km > 4 && km < 6){
        return 2;
    }
    else if (km > 6 && km < 8){
        return 3;
    }
    else if (km > 8 && km < 10){
        return 4;
    }
    else if (km > 10 && km < 12){
        return 5;
    }
    else if (km > 12 && km < 14){
        return 6;
    }
    else if (km > 14 && km < 16){
        return 7;
    }
    else if (km > 16 && km < 18){
        return 8;
    }
    else if (km > 18 && km < 20){
        return 9;
    }
    else if (km > 20 && km < 22){
        return 10;
    }
}

我已经尝试过了:

function getStage(km) { 
    var tempStage = 0;

    for (var i = 0; i < stages; i++) {
        var stage = i + 1;
        var tempKm = stage * 2;
        var nextKm = stage + 2;

        if (km > tempKm && km < nextKm) {
            tempStage = stage;
        }
    }
    return tempStage;
}

也许我不应该使用for循环?有更好的方法吗?

4 个答案:

答案 0 :(得分:4)

也许您正在寻找Math.floor

sum(zip(*array)[1])/len(array)

答案 1 :(得分:2)

您可以将km的底值除以2加1。

10是上限。

function getStage(km) {
    return Math.min((km >> 1) + 1, 10);
}

console.log(getStage(2.1)); // 2
console.log(getStage(3)); // 2
console.log(getStage(4)); // 4

答案 2 :(得分:2)

您可以使用数学来做到这一点。无需循环或条件。

请注意,您的输入间隔以2的“步长”增加,而输出以1的“步长”增加。这让我觉得也许我们应该将公里除以2
由于我们一直想要整数答案,因此可以使用 floor 函数。

一些例子:
floor(3/2)= 1
floor(4.1 / 2)= 2
等等

根据您要返回的极端情况(如果km = 2或km = 4或2的任意倍数怎么办?),我们可以在这里完成。如果希望在k = 4时返回1,在k = 6时返回2,依此类推,则需要做更多的工作。

*通常:* 如果您正在处理数字,并且发现自己写了很多情况,则通常可以使用一些简单的数学运算符组合来计算结果。对于此类问题,请尝试考虑您的输入/输出对以及它们之间的关系。

答案 3 :(得分:0)

尝试类似这样的方法。这是一种通用解决方案,不仅适用于2*n系列。

const stages = [2, 4, 6, 8, 10, 13, 15, 16, 20]; //should be ordered. Else sort it first.

const getStage = km => stages.indexOf(stages.find(i => km < i));

console.log(getStage(5)); //2
console.log(getStage(1.5)); //0
console.log(getStage(8.1)); //4
console.log(getStage(15)); //7
console.log(getStage(22)); //-1 out of index