编译器正在跳过返回线。通过递归进行二进制搜索

时间:2015-05-17 17:06:43

标签: c recursion binary-search

我使用递归调用制作二进制搜索程序(忽略printf语句)。在运行程序时,您将意识到它运行正常并获取要找到的元素的索引,但是:

#kill pid
os.kill(pid, signal.SIGTERM)

#wait for pid to release it back to the system
#this will block until the child is dead
os.waitpid(pid,0)

它不会返回mid,而是返回0。 (我尝试过0以外的值)。

我也尝试在结束时返回mid而不是返回0.它总是返回4.

整个代码是:

else if (element == arr[mid])
    {
        printf("\n%d\nmid = %d\nstart = %d\nend = %d\n\n", i, mid,start,end);
        return mid;
    }

2 个答案:

答案 0 :(得分:0)

该函数返回0因为这些语句

BinaryRecursivSearch(element, start, mid);
...
BinaryRecursivSearch(element, mid, end);

应该是

return BinaryRecursivSearch(element, start, mid);
...
return BinaryRecursivSearch(element, mid, end);

因为他们没有返回任何内容,所以最终的声明被执行

return 0;

答案 1 :(得分:0)

我的功能没有任何意义。 例如,我完全不明白这段代码片段的含义

if (mid == start)
{
    if(element!=end)
    {
        printf("\nElement not found");
        return -1;
    }
}

考虑到数组不仅包含{0,1,2,3,4,5,6,7,8,9}中的任何值,如程序中所示。因此,此代码段对二进制搜索方法没有任何意义。尝试使用具有不同值的数组,您的程序将无法按预期工作。

或在此代码段中

else if(element< arr [mid])         BinaryRecursivSearch(element,start,mid);

else if(element> arr [mid])         BinaryRecursivSearch(element,mid,end);

您不使用函数BinaryRecursivSearch返回的值。

我建议写一个简单的递归函数

这是一个演示程序,显示如何编写函数

#include <stdio.h>

int binary_search( const int a[], int n, int value )
{
    int middle;

    if ( n == 0 ) return -1;

    middle = n / 2;

    if ( value < a[middle] )
    {
        return binary_search( a, middle, value );
    }
    else if ( a[middle] < value )
    {
        int index = binary_search( a + middle + 1, n - middle - 1, value );
        return index == -1 ? -1 : index + middle + 1;
    }

    return middle;
}

#define N   10

int main(void) 
{
    int a[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    for ( int i = 0; i < N; i++ ) printf( "%d ", a[i] );
    printf( "\n" );

    for ( int i = -1; i <= N; i++ )
    {
        printf( "%d has index %d\n", i, binary_search( a, N, i ) );
    }

    return 0;
}

程序输出

0 1 2 3 4 5 6 7 8 9 
-1 has index -1
0 has index 0
1 has index 1
2 has index 2
3 has index 3
4 has index 4
5 has index 5
6 has index 6
7 has index 7
8 has index 8
9 has index 9
10 has index -1