3
我正在編寫二分查找實現。我遇到的問題是模式匹配塊。F#奇怪模式匹配結果
此代碼使用模式匹配返回奇怪的結果。第一個匹配塊不會返回我所期望的。它警告我永遠不會到達(_,_)
。
let binSearch (item:double) (arr:list<double>) =
let rec binSearchRec first last =
if first > last then
let lastIndex = arr.Length-1
let len = arr.Length
match (first, last) with
| (0, -1) -> System.String.Format("ITEM SMALLER THAN {0}", arr.[0])
| (len, lastIndex) -> System.String.Format("ITEM BIGGER THAN {0}", arr.[lastIndex])
| (_,_) -> System.String.Format("IN BETWEEN {0} AND {1}", arr.[last], arr.[first])
else
let mid = (first+last)/2
match item.CompareTo(arr.[mid]) with
| -1 -> binSearchRec first (mid-1)
| 0 -> "CONTAINS"
| 1 -> binSearchRec (mid+1) last
binSearchRec 0 (arr.Length-1)
更換,首先match (first, last)
電話本的if-else替代效果很好:
if first = 0 && last = -1 then
System.String.Format("ITEM SMALLER THAN {0}", arr.[0])
else if first = len && last = lastIndex then
System.String.Format("ITEM BIGGER THAN {0}", arr.[lastIndex])
else
System.String.Format("IN BETWEEN {0} AND {1}", arr.[last], arr.[first])
我不明白,那場比賽通話的此不同的if-else呼叫,爲什麼這個效果很好但模式匹配塊沒有。
一個奇怪的結果是打印在(len, lastIndex)
匹配len在匹配返回錯誤的數字。對於長度爲3的數組len
比賽語句之前打印將顯示3,而在比賽中的打印將顯示1
無論如何,在這種情況下不能使用文字,你只能將它用於字面值,而不是像'arr.Length'這樣的運行時值。 – Tarmil