在python中进行二进制搜索

时间:2016-05-03 22:42:56

标签: python algorithm binary-search

我坚持使用这一点代码。我需要在用户输入中读取费用编号,并将其与帐号编号数组进行比较。然后告诉用户该号码是否有效。我还必须使用二进制搜索算法。现在,当我运行程序时,我能够输入一个收费号码,但之后没有任何反应。不确定我错过了什么,或者我需要添加/更改什么。

谢谢!

def main():

    accountNumbers = [5658845, 4520125, 7895122, 8777541, 8451277, 1302850, 8080152, 4562555, 5552012, 5050552, 7825877, 1250255, 1005231, 6545321, 3852085, 7576651, 7881200,  4581002]
    accountNumbers.sort()
    chargeNumber = int(input('Please enter a charge number: '))
    binary_search(accountNumbers, chargeNumber)

def binary_search(accountNumbers, chargeNumber):

    first = 0
    last = len(accountNumbers) - 1
    found = 0
    while first <= last and found == 0:
        placeHolder = (first + last) // 2

        if accountNumbers[placeHolder] == chargeNumber:
            found = 1          
        else:
            if  chargeNumber < accountNumbers[placeHolder]:
                first = placeHolder + 1

            else:
                last = placeHolder - 1
    if  found == 1:  
        print('Charge account number', chargeNumber, 'was in the system.')
    else:
        print('Charge account number', chargeNumber, 'was not in the system.')        

main()

2 个答案:

答案 0 :(得分:1)

你有一个拼写错误...而不是使用=你曾使用==作为赋值运算符。变化

first == placeHolder + 1

first = placeHolder + 1

同样,在else子句“赋值”

答案 1 :(得分:1)

除了Dinesh提到的拼写错误之外,还有一些问题。

found == 1是另一个错字。它应该是found = 1

您正在查看剩余列表中错误的一半。如果chargeNumber小于当前的数据透视值,那么您应该查看列表的第一个一半(即last = placeHolder - 1)。切换first =last =语句应该可以解决这个问题,或者将<更改为>

当您在结尾检查found时,您将打印错误的消息。同样,切换两个print调用应该可以解决这个问题。另外,if found:应该足够(而不是if found == 1),因为bool(1) == True

另外,我建议使用python的bool类型。如果你使用int,那就好了,因为当需要一个非bool()类型时会调用bool,但它更能传达你使用found的意图// Get values from form $monto=$_POST['monto']; $personas=$_POST['personas']; $ciudad=$_POST['ciudad']; $giro1=$_POST['giro1']; $giro2=$_POST['giro2']; // Insert data into mysql $sql="INSERT INTO $tbl_name(monto, personas, ciudad, giro1, giro2)VALUES('$monto', '$personas', '$ciudad', '$giro1', '$giro2')"; $result=mysql_query($sql); 1}}作为布尔类型。