我偶然发现了代码中的某个问题,据说返回会停止我的方法,但就我而言并非如此。我试图制作一个名为“ binarySearch”的方法,据说该方法可以完成它的工作。
public int binarySearch(int lowIndex, int highIndex, int[] arr, int val) {
int middleIndex = (lowIndex + highIndex ) / 2;
if(arr[middleIndex] < val) {
lowIndex = middleIndex;
} else if (arr[middleIndex] > val) {
highIndex = middleIndex;
} else {
return middleIndex;
}
binarySearch(lowIndex, highIndex, arr, val);
return 0;
}
问题是如果我已经找到搜索值所在的索引,则else语句将返回该索引并已停止。但是,我总是得到“ 0”,这是我为默认返回值return 0
设置的值。因此,为了澄清起见,我在else语句上添加了一些文本以确保其执行并返回middleIndex
,然后该文本显示出来,因此基本上我的循环进入了else语句并希望返回middleIndex
,但没有。也许递归与此有关,但我不知道也许你们可以帮助我。
答案 0 :(得分:1)
由于方法的签名为public int binarySearch
,因此,您应该从binarySearch
方法的递归调用中返回int。您不应该真正return 0
正确实施此方法。
答案 1 :(得分:0)
您必须返回递归的结果。您可以参考下面显示的这段代码,以了解您在做什么错。
// Returns index of x if it is present in arr[l..
// r], else return -1
int binarySearch(int arr[], int l, int r, int x)
{
if (r>=l)
{
int mid = l + (r - l)/2;
// If the element is present at the
// middle itself
if (arr[mid] == x)
return mid;
// If element is smaller than mid, then
// it can only be present in left subarray
if (arr[mid] > x)
return binarySearch(arr, l, mid-1, x);
// Else the element can only be present
// in right subarray
return binarySearch(arr, mid+1, r, x);
}
// We reach here when element is not present
// in array
return -1;
}
有关BinarySearch及其实现的更多信息,请点击this链接
答案 2 :(得分:0)
以下是二进制搜索的迭代Java代码,您的代码有些缺陷。
mDatabase.child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
viewHolder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String eventTime = dataSnapshot.child("timeStamp").getValue().toString();
if(Integer.parseInt(nowTime) > Integer.parseInt(eventTime)){
Intent intent = new Intent(PrincipalActivity.this, TestingActivity.class);
intent.putExtra("eventKey", id);
startActivity(intent);
finish();
} else {
Intent intent = new Intent(PrincipalActivity.this, EventSingleActivity.class);
intent.putExtra("eventKey", id);
startActivity(intent);
}
}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 3 :(得分:0)
public static void binarySearch(int arr[], int first, int last, int key){
int mid = (first + last)/2;
while( first <= last ){
if ( arr[mid] < key ){
first = mid + 1;
}else if ( arr[mid] == key ){
System.out.println("Element is found at index: " + mid);
break;
}else{
last = mid - 1;
}
mid = (first + last)/2;
}
if ( first > last ){
System.out.println("Element is not found!");
}
您也可以通过递归来实现。
答案 4 :(得分:0)
您的代码中有一些小错误。
在递归中,当函数递归调用自身时,应将函数调用放在return语句中。这样可以确保将递归函数调用的结果返回给调用函数。
这是修改后的代码-
class BinarySearch
{
// Returns index of x if it is present in arr[l..
// r], else return 0
public int binarySearch(int lowIndex, int highIndex, int[] arr, int val)
{
if(highIndex>=lowIndex) //this line should be added for safety
{
int middleIndex = (lowIndex + highIndex ) / 2;
if(arr[middleIndex] < val)
{
lowIndex = middleIndex;
}
else if (arr[middleIndex] > val)
{
highIndex = middleIndex;
}
else
{
return middleIndex;
}
return binarySearch(lowIndex, highIndex, arr, val); //this should be the return statement
}
return 0;
}
// Driver method to test above
public static void main(String args[])
{
BinarySearch ob = new BinarySearch();
int arr[] = {1,2,3,4,5,6,7,8};
int n = arr.length;
int x = 7;
int result = ob.binarySearch(0,n-1,arr,x);
if (result == 0)
System.out.println("Element not present");
else
System.out.println("Element found at index " + result);
}
}
此代码可以正常工作。
上述代码的递归堆栈说明-
binarySearch(0,7,arr,val)
= return(binarySearch(3,7,arr,val))
= return(返回(binarySearch(5,7,arr,val)))
= return(return(return 6))//这里6是else块中返回的middleValue
=返回(返回6)
=返回6
由于您没有在代码中添加return语句,因此递归堆栈中最顶层的函数调用返回0。