簡體   English   中英

Python從程序重復輸出

[英]Python repeated output from program

我創建了二進制搜索,但是遇到了問題。 每當我運行main()時,當鍵等於8、5、2和1時,我只會得到None。我還試圖讓bsearch返回integer_list中key_point值的索引,但它只會返回key_point。 如果有人能讓我知道出了什么問題,我將不勝感激。

def bsearch(integer_list, key_point, start, end):
    midpoint = (start + end) // 2
    if start >= end:
        return None
    elif integer_list[midpoint] == key_point:
        return key_point
    elif integer_list[midpoint] > key_point:
        return bsearch(integer_list, key_point, start, (midpoint - 1))
    elif integer_list[midpoint] < key_point:
        return bsearch(integer_list, key_point, (midpoint + 1), end)


def main( ):
    integer_list = [x + 1 for x in range(0, 10)]
    key = 11
    p = len(integer_list) - 1
    start = integer_list[0]
    end = integer_list[p]
    while key >= 1:
        bsearch(integer_list, key, start, end)
        print(bsearch(integer_list, key, start, end))
        key = key - 1

您有以下錯誤:

1)從mainbinary_search的調用包含start = 1 and end = 10 which should have been start = 0和end = 9 (索引值)。我們根據索引找到所有中點。

2)只需檢查start > end因為start == end絕對正確,並且出現None情況都是由於這種情況。 由於這種情況您返回的所有情況實際上都是integer_list[midpoint] == key_point成立的情況。

這是更正的代碼:

def bsearch(integer_list, key_point, start, end):
    midpoint = (start + end) // 2
    if start > end:
        return None
    elif integer_list[midpoint] == key_point:
        return key_point
    elif integer_list[midpoint] > key_point:
        return bsearch(integer_list, key_point, start, (midpoint - 1))
    elif integer_list[midpoint] < key_point:
        return bsearch(integer_list, key_point, (midpoint + 1), end)


def main():
    integer_list = [x + 1 for x in range(0, 10)]
    key = 11
    p = len(integer_list) - 1
    start = integer_list[0]
    end = integer_list[p]
    while key >= 1:
        print(bsearch(integer_list, key, 0, p))
        key = key - 1
main()       

希望有幫助:)

您正在算法中多次混合索引和值。 您的基本案例/發現案例應該返回中點,因為這是您找到它的地方,但是您返回的是key_point,實際上是您要搜索的值。

同樣,在設置循環時,您將開始和結束值設置為List的開頭和結尾的內容,而不是開頭和結尾的索引。 如果您為test_list使用了一組數字,而不僅僅是連續數字1-11,那么其中的一些錯誤將變得更加明顯。 現在,它正好排隊。

首先,您要將值而不是索引傳遞給函數:

start = 0
end = len(integer_list) - 1

第二,當開始和結束都相反時,您需要返回None。 當它們相等時

if start > end:
        return None

第三,為什么要返回要搜索的值? 這沒有任何意義。 您應該改為返回元素的索引。

elif integer_list[midpoint] == key_point:
        return mid_point

最后,如果要遵循幾乎所有搜索方法返回的內容,則在找不到所需的值時應返回-1,而不是None。 這將使您免於頭痛。

if start > end:
        return -1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM