2016-12-15 4 views
0

Итак, я изучил этот алгоритм поиска бисекции в Python и я применяю его, чтобы найти приблизительно квадратный корень из числа. Что касается алгоритма, то он работает отлично на свои ограничения, однако, что-то я часто в JavaScript, является инкапсулировать условия внутри переменных, так что легче читать, например:Удержание условий Python вне цикла?

var isGreaterThanFive = num > 5; 
if(isGreaterThanFive && otherConditions...) 

Хотя делать это в JavaScript работ абсолютно нормально, когда я пытаюсь сделать это на Python, моя программа, похоже, переходит в бесконечный цикл. Это мой код в JavaScript:

function sqrtOf (x) { 
    var min = 0 
    var max = x 
    var epsylon = 0.001 
    var guess = (max + min)/2 
    var guessNumber = 0; 

    //I created these two so it is easier to understand 
    var notCloseEnough = Math.abs(Math.pow(guess, 2) - x) >= epsylon; 
    var stillPlausible = guess <= x; 

    while (notCloseEnough && stillPlausible) { 
    guessNumber += 1 

    if(Math.abs(Math.pow(guess, 2)) > x) { 
     max = guess; 
    } else { 
     min = guess; 
    } 

    guess = (max + min)/2; 
    } 

    return guess; 
} 

console.log(sqrtOf(25)); // 5 

И теперь в Python:

def sqrtOf (x) 
    minVal = 0 
    maxVal = x 
    epsylon = 0.001 
    guess = (maxVal + minVal)/2.0 
    guessNumber = 0; 

    notCloseEnough = abs(guess ** 2 - x) >= epsylon 
    stillPlausible = guess <= x 

    while notCloseEnough and stillPlausible: 
    guessNumber += 1 

    if abs(guess ** 2) > x: 
     maxVal = guess 
    else: 
     minVal = guess 

    guess = (maxVal + minVal)/2.0 

    return guess 

print sqrtOf(25) 
+4

Если у вас есть и присвоение, выражение в правой части '=' оценивается перед назначением переменной. поэтому 'stillPlausibe' равен либо« True », либо« False »к тому времени, когда цикл запущен, и вы никогда ничего не измените. –

+1

Ваш код javascript имеет ту же проблему ... – Izkata

ответ

1

Когда вы писали

notCloseEnough = abs(guess ** 2 - x) >= epsylon 

вы оценили заявление abs(guess ** 2 - x) >= epsylon и назначил ее результат notCloseEnough. Это вычисление не выполняется снова, потому что вы позже ссылаетесь на его результат в коде.

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

def sqrtOf (x): 
    minVal = 0 
    maxVal = x 
    epsylon = 0.001 
    guess = (maxVal + minVal)/2.0 
    guessNumber = 0 

    def notCloseEnough(): 
    return abs(guess ** 2 - x) >= epsylon 

    def stillPlausible(): 
    return guess <= x 

    while notCloseEnough() and stillPlausible(): 
    guessNumber += 1 

    if abs(guess ** 2) > x: 
     maxVal = guess 
    else: 
     minVal = guess 

    guess = (maxVal + minVal)/2.0 

    return guess 

print sqrtOf(25) 
1

Это слишком хорошо, stillPlausible сбивает с толку меня. Вход должен быть проверен перед циклом.

def sqrtOf(x): 
    minVal = 0 
    maxVal = x 
    epsylon = 0.001 
    guess = (maxVal + minVal)/2.0 
    guessNumber = 0; 
    def trytrytry(): 
    while True: 
     yield (abs(guess ** 2 - x) < epsylon, guess - x < epsylon) 

    for (closeEnough, stillPlausible) in trytrytry(): 
    if closeEnough or not stillPlausible: 
     break 
    guessNumber += 1 

    if abs(guess ** 2) > x: 
     maxVal = guess 
    else: 
     minVal = guess 

    guess = (maxVal + minVal)/2.0 

    return guess 

print sqrtOf(25) 
Смежные вопросы