反向PHP函数

时间:2016-09-30 12:34:35

标签: php math

我有一个功能可以根据用户的体验返回用户的级别。我该如何改变这一点,以便我可以输入级别并获得该级别所需的体验

function getLevel($experience)
{
    return round ( sqrt( pow($experience, 1.4) - 1.5*$experience +1) /100 );
}

function getExperienceByLevel($level)
{
    return ???;
}

这是我到目前为止所做的,使用常规数学。由于我知道 $ level ,我希望表达式与$experience = XXXX类似。

$level      = sqrt( pow($experience, 1.4) - 1.5*$experience +1) /100;
$level*100  = sqrt( pow($experience, 1.4) - 1.5*$experience +1);

pow($level*100, 2) = pow($experience, 1.4) - 1.5*$experience + 1;

1 个答案:

答案 0 :(得分:4)

我们需要在这里做一些代数。等级的公式是

lvl = floor( sqrt( expr^1.4 - 1.5*expr +1) / 100 + 0.5)

向后工作考虑

lvl = sqrt( expr^1.4 - 1.5*expr +1) / 100 + 0.5

然后

lvl - 0.5 = sqrt( expr^1.4 - 1.5*expr +1) / 100

100 * lvl - 50 = sqrt( expr^1.4 - 1.5*expr + 1)

10000 * lvl^2 - 10000 * lvl + 2500 =  expr^1.4 - 1.5*expr + 1
10000 * lvl^2 - 10000 * lvl + 2499 =  expr^1.4 - 1.5*expr

现在让左手边靠Q,所以我们有

expr^1.4 - 1.5*expr = Q

这实际上是一个用代数方法求解的硬方程。通过忽略线性部分可以得到近似值,以得到更简单的方程式

expr^1.4 = Q

expr = pow(Q, 1/1.4)

这实际上告诉我们,用数字解决它可能更好。你也可以构建一个查找表。一个简单的方法是

int[] exprForLevel
function generateExprsForLevel() {
    curLevel = 1
    expForLevel[1] = 0
    for(i=0; i< MaxPossibleExperience; ++i) {
        lvl = getLevel(i)
        if(lvl > curLevel) {
            curLevel = lvl
            expForLevel[curLevel] = i
        }
    }

function getExperienceByLevel(level) {   
    return expForLevel[level]
}

上述伪代码效率非常低,因为它检查每个可能的经验值。如今计算机非常高效,因此您可能会发现其数百万的经验。您可能会发现涉及二进制细分的例程应该更快地收敛到值。