如何从重复中获得布尔值

时间:2012-11-08 18:45:59

标签: c

我使用重复进行了这个二进制搜索,然而,当我得到答案(布尔值)时,我似乎偶然发现了重复,并且无法从函数中得到正确的答案。 有人可以帮忙吗?请评论代码。

// binary search
bool 
search(int value, int array[], int n)
{

    // the array has more than 1 item
    if (n > 1)
    {
        int m = (n/2);

        // compares the middle point to the value
        if (value == array [m])
            return true;

        // if the value given is lower than the middle point of the array
        if (value < array [m])
        {
            int *new_array = malloc (m * sizeof(int));

            // creating a new array with the lower half of the original one
            memcpy(new_array, array, m * sizeof(int));

            // recalling the function
            search (value, new_array, m);
        }


        // if the value given is greater than the middle point of the array
        else
        {
            int *new_array = malloc (m * sizeof(int));

            // creating a new array with the upper half of the original one
            memcpy(new_array, array + (m + 1), (m  * sizeof(int)));

            // recalling the function
            search (value, new_array, m);
        }
    }

    else if (n==1)
    {

        // comparing the one item array with the value
        if (array[0] == value)
            return true;

        else
            return false;

    }

    if (true)
        return true;

    else 
        return false;



}

3 个答案:

答案 0 :(得分:0)

您需要返回递归搜索的值。

return search (value, new_array, m);

否则当你打电话给搜索时,你只是丢掉了答案

答案 1 :(得分:0)

您应该return search(...);,而不仅仅是调用search()方法 - 否则返回值不会冒泡。

此外,请注意,此算法为O(n)(数组大小呈线性),并且内存泄漏且效率非常低,因为您在每次迭代中复制了一半数组。 实际上,它可能使算法比元素的幼稚线性搜索慢得多。

一个好的二进制搜索不需要复制一半的数组 - 它只是“看起来”它的一半。可以通过发送array+m作为数组(对于较高的一半)来实现,只有减少n对于下半部分就足够了。

答案 2 :(得分:0)

正如amint所提到的,复制数组完全违背了进行二进制搜索的目的。其次,我认为你的意思是递归,而不是重复。

要考虑的事情:不要复制数组,而是考虑如何通过将一组索引传递给数组(如开头和结尾)来实现相同的结果。

关于你的实际问题,如何通过递归返回布尔值。关于从递归函数返回值的事情是每次迭代都必须传递该值。您可以将其视为一系列责任委托。第一个电话就像是公司的负责人。他不做所有的工作,所以他把它委托给他的助手,但他先做了一件工作。然后助手有一个助手等。乌龟一直向下;)

为了获得价值,链中的每个人都必须将它交还给他们之前的人。回到编程,这意味着每次递归调用搜索时,都需要返回该值。

最后,一旦你有了这些东西,你需要更好地定义你的基础案例。我认为这就是你要做的事情     如果是真的)         返回true;     其他         返回false; 然而,正如H2CO3所指出的,这没有多大意义。实际上,您之前的if语句if (n == 1) ...应该确保之后的代码永远不会被执行。