簡體   English   中英

C語言中的二進制搜索遞歸算法問題

[英]Binary Search Recursion Algorithm Issue In C

好的,所以我給了這個功能

int bin(int value, int size, int array[])

我應該在“array []”中找到“value”,但是這里的問題在於,在大多數情況下,我們有類似的東西。

int bin(int value, int max, int min, int array[])

從邏輯上講,這部分的遞歸要容易得多,因為我仍然可以傳遞我所在的數字,以及記住數組的大小。

int bin(int array[], int value, int min, int max)
{
    if(max < min)
        return -1;
    else
    {
        int mid = min + (max - min)/2;

        if(array[mid] > value)
            return bin(array, value, min, mid-1);
        else if(array[mid] < value)
            return bin(array, value, mid+1, max);
        else
            return mid;
    }

但由於我只能傳遞1個整數,我究竟會如何調整這個算法呢? 從本質上講,我只能做這樣的事情,但我知道它在邏輯上不會起作用。 有沒有辦法,我可以看到數組的大小? 我嘗試過,但數字沒有正確處理。

   int bin(int array[], int value, int size)
    {
            int mid = size/2;

            if(array[mid] > value)
                return bin(array, value, size-(size/2));
            else if(array[mid] < value)
                return bin(array, value, size+(size/2));
            else
                return mid;
    }

您還需要明確傳遞基數:

int
bin(int array[], int value, int size)
{
        int mid = size/2;

        if(array[mid] > value)
            return bin(array, value, size/2);
        else if(array[mid] < value)
            return bin(&array[mid], value, size/2);
        else
            return mid;
}

請注意“if(array [mid] <value)”情況下的“&array [mid]”

每次,使用base + offset副最小值/最大值索引,您可以搜索正確的一半數組

使用具有不同參數集的方法的目的是使該方法易於為用戶調用。 這在遞歸中很常見。

有一個公共方法可供具有該用戶的用戶使用
int bin(int value, int size, int array[])簽名。

那么應該有私有的,內部的幫助方法
int bin(int value, int max, int min, int array[])簽名。

關鍵是,有人調用此方法將要傳遞數組的大小,而不是傳入的開始和結束索引(因為對它們來說,起始索引應始終為0,end應始終為size-1)並且它是不正確的做法,讓一個方法具有預設的參數。

具有開始和結束值(min和max)的輔助方法在遞歸調用中用於更有效的計算,並且它隱藏了來自用戶的不必要的參數。

你的方法應該是這樣的:

int bin(int value, int size, int array[]) {
    return bin(value, size - 1, 0, array);
}
int * binSearch (int *arr,int size, int num2Search)

{

    if(size==1)

        return ((*arr==num2Search)?(arr):(NULL));

    if(*(arr+(size/2))<num2Search)

        return binSearch(arr+(size/2)+1,(size/2),num2Search);

    if(*(arr+(size/2))==num2Search)

        return (arr+(size/2));

    return binSearch(arr,(size/2),num2Search);

}

在我的函數中,您獲得相同的參數並返回值的地址。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM