DEAR 各位大大早安
終於有比較不那麼冷了
事情是這樣的我接到一個任務是C語言if改用while
/*if(low > high)
return -1;
else{
middle = (low+high) /2;
if(target == data[middle])
return middle;
else if (target<data[middle])
return binary(data,low,middle-1,target);
else
return binary(data,middle+1,high,target);
}*/
改成
while(low > high){
return -1;
}
但是.....
雖然可以run可是覺得沒信心
覺得比大小的功能沒有出來
麻煩各位大大給點建議,謝謝
一、需求說明不清楚
你的程式是:
這部分你應當在問題中說明
二、邏輯不合理
if 是流程控制中的選擇敘述
while 是流程控制中的重複敘述
兩者是不同的功能,要怎麼替換?
若說用 switch 替換 if 或用 while 替換 for 還比較合理
三、結論
既然 while 不能完全替代 if
那麼你的問題應該是將二分搜尋法改為循序搜尋法
int binary(int* data, int low, int high, int target) {
while(low <= high){
if(data[low] == target) {
return low;
}
low++;
}
return -1;
}
或將遞迴改為非遞迴
int binary(int* data, int low, int high, int target) {
int middle = (low + high) / 2;
do {
if(target == data[middle])
return middle;
else if (target < data[middle])
high = middle - 1;
else
low = middle + 1;
middle = (low + high) / 2;
} while (low <= high);
return -1;
}
可以看到 while 中仍然有 if,這是無可避免的
另外這要求很詭異,因為題目通常是往進階改,而不是改回來
因此推斷你的理解可能有誤?
如果我沒猜錯用while可能是指要用遞迴以外的方式解,我會寫成這樣
int binary(int* data, int low, int high, int target){
while(low <= high){
int middle = (low + high) / 2;
if(target == data[middle]){ // middle就是目標的索引
return middle;
}
if (target < data[middle]){ // target比中間值小 -> 減少high
high = middle - 1;
}
else{ // target 比中間值大 -> 增加low
low = middle + 1;
}
}
return -1; // low < high
}
ps有排版看起來應該會清楚點