即使我点击 return Java 也无法跳出 while 循环
Could not jump out of a while loop even when I hit a return Java
这是我的代码,当我输入{2, 3, 4, 5}和= {1}时,即使我点击"return r1"我也无法跳出while循环。
该程序将打印“???”,但会一直循环直到它获得索引超出范围的异常。
它是有线的。
int[] nums1 = {2, 3, 4, 5}, nums2 = {1};
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
if(nums1.length > nums2.length) {
findMedianSortedArrays(nums2, nums1);
}
int half = (nums1.length + nums2.length) / 2;
double l1 = 0;
double l2 = 0;
double r1 = 0;
double r2 = 0;
int cutR = nums1.length;
int cutL = 0;
int cut1 = 0;
while(cut1 <= nums1.length) {
cut1 = (cutR + cutL) / 2;
int cut2 = half - cut1;
l1 = (cut1 == 0) ? Integer.MIN_VALUE : nums1[cut1 - 1];
r1 = (cut1 == nums1.length) ? Integer.MAX_VALUE : nums1[cut1];
l2 = (cut2 == 0) ? Integer.MIN_VALUE : nums2[cut2 - 1];
r2 = (cut2 == nums2.length) ? Integer.MAX_VALUE:nums2[cut2];
if(l1 > r2)
cutR = cut1 - 1;
else if(l2 > r1)
cutL = cut1 + 1;
else {
if((nums1.length + nums2.length) % 2 == 0) {
l1 = (l1 > l2) ? l1 : l2;
r1 = (r1 < r2) ? r1 : r2;
return (l1 + r1) / 2;
} else {
r1 = (r1 < r2) ? r1 : r2;
System.out.println("???");
return r1;
}
}
}
return -1;
}
当您递归调用一个方法时,您会在堆栈上创建该方法的一个新实例。尝试将其视为关卡,甚至可能是电影《盗梦空间》。您在 main 方法中并调用了 运行()。您现在处于 运行() 的第 1 级。如果您在第 1 级再次调用 运行(),您将进入第 2 级。当您从第 2 级 return 时,您返回到第 1 级。如果您从 return级别 1,您返回到调用原始 运行() 的位置。
我可能没有正确理解你打算做什么,但我认为你的问题是由于这个:
if(nums1.length > nums2.length) {
findMedianSortedArrays(nums2, nums1);
}
我想如果 nums1.length
<= nums2.length
你的方法有效,否则你只是在交换参数后调用它。
发生时的问题是你没有对 return 值做任何事情(它成功所以它输出 ???
)然后你继续使用错误的参数并最终抛出一个 IndexOutOfBoundException
.
您只需要做的就是 return 具有预期顺序的参数的值:
if(nums1.length > nums2.length) {
return findMedianSortedArrays(nums2, nums1);
}
这是我的代码,当我输入{2, 3, 4, 5}和= {1}时,即使我点击"return r1"我也无法跳出while循环。 该程序将打印“???”,但会一直循环直到它获得索引超出范围的异常。 它是有线的。
int[] nums1 = {2, 3, 4, 5}, nums2 = {1};
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
if(nums1.length > nums2.length) {
findMedianSortedArrays(nums2, nums1);
}
int half = (nums1.length + nums2.length) / 2;
double l1 = 0;
double l2 = 0;
double r1 = 0;
double r2 = 0;
int cutR = nums1.length;
int cutL = 0;
int cut1 = 0;
while(cut1 <= nums1.length) {
cut1 = (cutR + cutL) / 2;
int cut2 = half - cut1;
l1 = (cut1 == 0) ? Integer.MIN_VALUE : nums1[cut1 - 1];
r1 = (cut1 == nums1.length) ? Integer.MAX_VALUE : nums1[cut1];
l2 = (cut2 == 0) ? Integer.MIN_VALUE : nums2[cut2 - 1];
r2 = (cut2 == nums2.length) ? Integer.MAX_VALUE:nums2[cut2];
if(l1 > r2)
cutR = cut1 - 1;
else if(l2 > r1)
cutL = cut1 + 1;
else {
if((nums1.length + nums2.length) % 2 == 0) {
l1 = (l1 > l2) ? l1 : l2;
r1 = (r1 < r2) ? r1 : r2;
return (l1 + r1) / 2;
} else {
r1 = (r1 < r2) ? r1 : r2;
System.out.println("???");
return r1;
}
}
}
return -1;
}
当您递归调用一个方法时,您会在堆栈上创建该方法的一个新实例。尝试将其视为关卡,甚至可能是电影《盗梦空间》。您在 main 方法中并调用了 运行()。您现在处于 运行() 的第 1 级。如果您在第 1 级再次调用 运行(),您将进入第 2 级。当您从第 2 级 return 时,您返回到第 1 级。如果您从 return级别 1,您返回到调用原始 运行() 的位置。
我可能没有正确理解你打算做什么,但我认为你的问题是由于这个:
if(nums1.length > nums2.length) {
findMedianSortedArrays(nums2, nums1);
}
我想如果 nums1.length
<= nums2.length
你的方法有效,否则你只是在交换参数后调用它。
发生时的问题是你没有对 return 值做任何事情(它成功所以它输出 ???
)然后你继续使用错误的参数并最终抛出一个 IndexOutOfBoundException
.
您只需要做的就是 return 具有预期顺序的参数的值:
if(nums1.length > nums2.length) {
return findMedianSortedArrays(nums2, nums1);
}