2016-12-15 34 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)