好的,所以我给了这个功能
int bin(int value, int size, int array[])
我应该找到"价值"在" array []"内,但这里的问题在于,在大多数情况下,我们有类似的内容
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;
}
答案 0 :(得分:13)
您还需要明确传递基数:
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]&lt; value)”案例中的&amp; array [mid]
每次,使用base + offset副最小值/最大值索引,你有正确的一半数组要搜索
答案 1 :(得分:0)
使用具有不同参数集的方法的目的是使该方法易于为用户调用。这在递归中很常见。
对于具有
的用户,可以使用公共方法
int bin(int value, int size, int array[])
签名。
然后应该有一个私人的内部帮助方法
int bin(int value, int max, int min, int array[])
签名。
关键是,有人调用此方法会传递数组的大小,而不是传入的开始和结束索引(因为对它们来说,起始索引应始终为0,end应始终为size-1)并且使用具有这样预设的参数的方法是不好的做法。
带有start和end值(min和max)的helper方法用于递归调用以实现更高效的计算,并且它隐藏了用户不必要的参数。
你的方法应该是这样的:
int bin(int value, int size, int array[]) {
return bin(value, size - 1, 0, array);
}
答案 2 :(得分:0)
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);
}
在我的函数中,您获得相同的参数并返回值的地址。