2013-04-11 35 views
1

我正在輔導基本搜索和排序的人。在插入排序中,當我有一個大於數值前一個值的值時,我會進行負面迭代。當然,這種方法可能會導致問題,因爲有一個檢查調用了不存在的array [-1]。需要一個令人困惑的方式的解釋和布爾運作

如下粗體下劃線所示,添加和x> 0布爾值可防止索引問題。

我的問題是怎麼回事?爲了確保兩個布爾值的有效性,是否仍然不會調用array [-1]?

the_list = [10,2,4,3,5,7,8,9,6] 

for x in range(1,len(the_list)): 
    value = the_list[x] 


    while value < the_list[x-1] **and x > 0**: 

     the_list[x] = the_list[x-1] 

     x=x-1 

    the_list[x] = value 

print the_list 
+0

根據下面的答案,通過'and'語句的大多數現代語言將停止其中一個布爾人不符合條件。不幸的是,這引發了第二個問題,即首先評估哪個布爾值。與表面上預​​期的從左到右的方式相反,它看起來像* python的*評估順序是不同的。因此,現在剩下的就是找到有關該訂單算法的文檔。 – user2271967 2013-04-12 16:51:57

回答

0

我不知道我完全明白的問題,我不知道這是什麼編程語言,但大多數現代編程語言使用所謂的短路默認布爾評估,使一旦結果已知,邏輯表達式就不會被進一步評估。

你可以用它來防範範圍溢出,這樣的:

while x > 0 and value < the_list[x-1] 

將x的範圍在這裏的支票必須在使用前都

+0

這似乎是這種情況。我想到的想法是,第二個程序會說*和*聲明,它會反向引用布爾值,然後檢查它們。然而在Python中,似乎顛倒順序並沒有什麼區別。我應該注意到這個語言是python。 – user2271967 2013-04-11 20:33:20

0

AND操作返回true當且僅當兩個參數都是真的,所以如果其中一個參數爲假,那麼沒有必要檢查其他參數,因爲最終值在該點已知。至於你的例子,通常評估從左到右,但它不是一個原則,它看起來你使用的語言不是遵循該規則(其他它仍然應該崩潰陣列查找)。但是ut可能是,這個特定的實現以某種方式優化它(恕我直言不是個好主意)並且在查找數組之前首先評估「更簡單」的事情(比如檢查x > 0)。檢查規範爲什麼這個確切的順序適合你,就像在大多數流行語言中一樣,如果在查找之前不會評估x > 0

+0

謝謝,這是我懷疑的,但是我仍然想知道關於布爾分辨率的優先順序是什麼。 – user2271967 2013-04-11 20:31:45

+0

我會遵循'從左到右'的順序規則,而不考慮使用的語言,因爲大多數情況下,你會得到什麼。在這個問題中,檢查使用的語言的規格 – 2013-04-11 20:33:47