iT邦幫忙

0

C語言if改用while覺得沒信心

Tzu 2021-01-10 09:48:572180 瀏覽

DEAR 各位大大早安
終於有比較不那麼冷了
/images/emoticon/emoticon06.gif
事情是這樣的我接到一個任務是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可是覺得沒信心
覺得比大小的功能沒有出來
/images/emoticon/emoticon04.gif
https://ithelp.ithome.com.tw/upload/images/20210110/20119035hKWEwCswxA.png
/images/emoticon/emoticon22.gif
麻煩各位大大給點建議,謝謝

Tzu iT邦新手 1 級 ‧ 2021-01-10 09:50:16 檢舉
完整的code
````
#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 11

int binary(int*data,int low,int high,int target){
int middle;

while(low > high){
return -1;
}

/*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);
}*/

}


int main(){
int data[MAX_LEN]=
{1,8,9,15,25,33,42,66,74,81,90};
int i,index,target,c;
printf("原始陣列:");
for (i = 0 ; i < MAX_LEN ; i++ )
printf("[%d]",data[i]);
printf("\n");
target=0;
while (target !=-1){
printf("請輸入搜尋值(-1結束)==>");
scanf("%d",&target);
index=binary(data,0,MAX_LEN-1,target);
if(index !=-1)
printf("搜尋到鍵值:%d(%d)\n",target,index);
else
printf("沒有搜尋到鍵值:%d\n",target);

}

return 0;
}


````
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
鬼王很慘
iT邦新手 2 級 ‧ 2021-01-10 16:17:08
最佳解答

一、需求說明不清楚
你的程式是:

  1. 創建數字陣列
  2. 獲取使用者輸入的值
  3. 查找陣列中該值的位置
  4. 找到回傳 index
  5. 找不到回傳 -1

這部分你應當在問題中說明

二、邏輯不合理
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,這是無可避免的
另外這要求很詭異,因為題目通常是往進階改,而不是改回來
因此推斷你的理解可能有誤?

Tzu iT邦新手 1 級 ‧ 2021-01-10 21:55:47 檢舉

謝謝大大

0
0427ryan
iT邦新手 5 級 ‧ 2021-01-10 16:55:19

如果我沒猜錯用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有排版看起來應該會清楚點

Tzu iT邦新手 1 級 ‧ 2021-01-10 21:55:32 檢舉

很謝謝大大~但是樓上的說明比較多...所以.../images/emoticon/emoticon16.gif

0427ryan iT邦新手 5 級 ‧ 2021-01-11 17:51:11 檢舉

我昨天才註冊,我好像該找時間練習發文了/images/emoticon/emoticon76.gif

我要發表回答

立即登入回答