我正在執行二進制搜索。該函數返回在數組中找到的目標值的索引,否則返回-1
。向下轉換數組長度和索引
我更喜歡處理i32
索引,而不是usize
,因爲當我找不到目標時我需要返回-1
。我明確地在該函數的邊緣進行投射,我認爲這不是很好。什麼是更生鏽的方式呢?
fn binary_search(nums: &[i32], target: i32) -> i32 {
let num_size: i32 = nums.len() as i32; // This seems bad
bsearch(nums, target, 0, num_size as usize)
}
fn bsearch(nums: &[i32], target: i32, lo: usize, hi: usize) -> i32 {
if hi < lo {
return -1;
}
let mid_idx = lo + ((hi - lo)/2);
let guess = nums[mid_idx];
if guess > target {
bsearch(nums, target, lo, mid_idx - 1)
} else if guess < target {
bsearch(nums, target, mid_idx + 1, hi)
} else {
mid_idx as i32 // This seems bad
}
}
您也可以查看[binary_search'的標準庫實現](https://doc.rust-lang.org/std/primitive.slice.html#method.binary_search)以獲得提示一種慣用的Rust方式會是什麼。 – Shepmaster
沒有考慮到,謝謝! –