使用递归而不使用数组中的元素数进行二进制搜索?

时间:2017-03-08 14:50:05

标签: c arrays recursion

我正在编写一个程序,通过递归使用二进制搜索,用户输入的整数为0,即输入的最后一个整数。我假设用户将按递增顺序输入它们,并且它们不会输入超过10个整数。我已经让它工作了,但它总是返回搜索的数字是在系列中,而不是。例如:

Numbers entered: 1 2 3 4 5 6 0
Number to search for: 9
9 is in the series

我想它与不了解数组的大小有关,除了它的最大值是10,但我不想要求用户想要的元素数量。我该如何解决这个问题?

#include <stdio.h>

int find_m(int a[], int i, int m)

{ 
    int mid;

    if (first>last) {
        return -1;
    }
    mid=(first+last)/2;
    if (a[mid]>m) {
        find_m(a, first, mid-1, m);
    }
    else if (a[mid]<m) {
        find_m(a, first, mid+1, m);
    }
    else {
        return mid;
    }

}


int main()

{
    int a[10], i, m, first, mid, last, found;

    for (i=0; i<10; i++) {
        printf ("Please enter integers (no more than 10 numbers) in increasing order with a 0 as the last number\n"); 
        scanf ("%d", &a[i]);
        if (a[i]==0) {
            break;
        }
    }   

    printf ("Now enter a number you would like to find in the series\n");
    scanf ("%d", m); 

    found=find_m(a, m, 0, i-1);

    if (found==1) {
        printf ("%d is not in the series\n", m);
    }
    else {
        printf ("%d is in the series\n", m);
    }

    return 0;

}

1 个答案:

答案 0 :(得分:0)

if (a[mid]>m) {
    find_m(a, first, mid-1, m);
}
else if (a[mid]<m) {
    find_m(a, first, mid+1, m);
}
else {
    return mid;
}

在上面的代码中,您只返回if / else if / else块的3个可能分支中的1个值,然后函数结束。因此,您为其他人获取了未定义的行为2.您需要returnfind_m()调用获得的结果,尽管看起来很found }最终成为该值的数组中的位置而不仅仅是1。