2016-09-30 5 views
3

У меня есть функция, которая возвращает уровень пользователя на основе пользователя.. Как я могу это сделать, чтобы я мог ввести уровень и получить нужный вам уровень?Обратная функция PHP

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

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

Это то, что я сделал до сих пор, используя регулярные математические вычисления. Поскольку я знаю уровень $, я хочу, чтобы выражение было как $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; 
+0

передать другой параметр в основной функции и на основе вызова значения другой функции внутри основной функции –

+0

Обновлен вопрос. – Fredrik

+0

Кроме того, я мог бы сделать цикл, который вызвал getLevel(), пока не получил уровень. Но это кажется очень уродливым способом сделать это. – Fredrik

ответ

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] 
} 

Вышеуказанный псевдокод довольно неэффективен, поскольку он проверяет все возможные значения опыта. В этот день компьютеры довольно эффективны, поэтому вы можете найти их до миллиона опыта. Вы могли бы обнаружить, что процедура, включающая двоичное подразделение, должна быстрее сходиться к значениям.

Смежные вопросы