在递归问题中无法 return 基本案例值
Unable to return base case value in Recursion problem
编辑:谢谢你的回答,我明白了!
我刚开始学习数据结构,我似乎无法弄清楚为什么基本情况不起作用。在这种方法中,我们应该拆分我们得到的数组并搜索键,如果它比你拆分的地方 bigger/smaller 。找到下面的方法(我去掉了大部分 sys.out.println 因为堆栈溢出说我的代码太多了):-
public static int nSearch (int n, int a[], int fromIndex, int toIndex, int key){
//base case
if ((toIndex - fromIndex) <= n)
{ // if there is only one element per split or less
for (int i = fromIndex; i < toIndex; i++) {
if (a[i] == key) {
System.out.println("If a[i] == key runs.");
return i;
}
}
return -1;
}
int splitIndex = a.length/n; //2
if (key >= a[splitIndex]) { // if key is bigger/equal to a[splitIndex], meaning the range is 2-3
nSearch (n, a, splitIndex, a.length, key);
}
else {
//else the range is 0-1
nSearch (n, a, 0, splitIndex, key);
}
return 0;
}
这是我发送测试用例时控制台 returns 的内容:
My Search Tester 2 is Running Now.
Array Length: - 4
Starting nSearch: - n : 2 fromIndex : 0 toIndex : 4
false
Case 1: n = 2 SplitIndex Value = 2 aLength = 4 Key value = 4
Starting nSearch: - n : 2 fromIndex : 2 toIndex : 4
true
Base Case Running
For loop Running
fromIndex : 2 toIndex : 4
i : 2 a[i] : 3 Key : 4
For loop Running
fromIndex : 2 toIndex : 4
i : 3 a[i] : 4 Key : 4
If a[i] == key runs.
Target 4 is at Index := 0
可以看到,输出显示控制进入了if (a[i] == key)
块,但是我不明白为什么return i
不起作用。请告诉我我做错了什么。
我不能 post 测试代码,以免拒绝我的 post 主要是代码,但这是我正在使用的测试用例:
int arr = {1,2,3,4}
nSearch(2, arr, 0, arr.length, 4);
nSearch
方法应该是二进制搜索的变体,如果有帮助的话。
I don't understand why return i
doesn't work
没有理由认为 return
语句没有像宣传的那样工作,但在大多数情况下,程序会忽略生成的 return 值。
但请注意方法末尾的 return 0
。你认为在什么情况下执行是合适的?答案:none。我怀疑您添加它是为了清除编译器关于控制到达 non-void 方法末尾的反对意见,但如果是这样,那么您应该更深入地研究:为什么控制首先到达那个点?
考虑紧接在前的位:
if (key >= a[splitIndex]) { // if key is bigger/equal to a[splitIndex], meaning the range is 2-3
nSearch (n, a, splitIndex, a.length, key);
}
else {
//else the range is 0-1
nSearch (n, a, 0, splitIndex, key);
}
在每个分支中递归调用 nSearch()
,但是当递归调用 return 时会发生什么?没什么特别的。控制只是从那里继续,直接到那个错误的 return 0
,它产生测试器报告的 0 return 值。递归调用 returned 的任何值都将被忽略。
您方法最后几行的这种变体应该更适合您:
if (key >= a[splitIndex]) {
return nSearch(n, a, splitIndex, a.length, key);
} else {
return nSearch(n, a, 0, splitIndex, key);
}
// return 0;
你应该在从内部递归得到结果后终止递归。此外,在此 nSearch (n, a, splitIndex, a.length, key);
中,您正在检查直到 a.length
,而不管此方法调用中的实际 toIndex 是什么(fromIndex 相同)。所以以下更改应该会给你正确的答案。
if (key >= a[splitIndex]) {
return nSearch(n, a, splitIndex, toIndex, key);
}
else {
return nSearch(n, a, fromIndex, splitIndex, key);
}
编辑:谢谢你的回答,我明白了!
我刚开始学习数据结构,我似乎无法弄清楚为什么基本情况不起作用。在这种方法中,我们应该拆分我们得到的数组并搜索键,如果它比你拆分的地方 bigger/smaller 。找到下面的方法(我去掉了大部分 sys.out.println 因为堆栈溢出说我的代码太多了):-
public static int nSearch (int n, int a[], int fromIndex, int toIndex, int key){
//base case
if ((toIndex - fromIndex) <= n)
{ // if there is only one element per split or less
for (int i = fromIndex; i < toIndex; i++) {
if (a[i] == key) {
System.out.println("If a[i] == key runs.");
return i;
}
}
return -1;
}
int splitIndex = a.length/n; //2
if (key >= a[splitIndex]) { // if key is bigger/equal to a[splitIndex], meaning the range is 2-3
nSearch (n, a, splitIndex, a.length, key);
}
else {
//else the range is 0-1
nSearch (n, a, 0, splitIndex, key);
}
return 0;
}
这是我发送测试用例时控制台 returns 的内容:
My Search Tester 2 is Running Now.
Array Length: - 4
Starting nSearch: - n : 2 fromIndex : 0 toIndex : 4
false
Case 1: n = 2 SplitIndex Value = 2 aLength = 4 Key value = 4
Starting nSearch: - n : 2 fromIndex : 2 toIndex : 4
true
Base Case Running
For loop Running
fromIndex : 2 toIndex : 4
i : 2 a[i] : 3 Key : 4
For loop Running
fromIndex : 2 toIndex : 4
i : 3 a[i] : 4 Key : 4
If a[i] == key runs.
Target 4 is at Index := 0
可以看到,输出显示控制进入了if (a[i] == key)
块,但是我不明白为什么return i
不起作用。请告诉我我做错了什么。
我不能 post 测试代码,以免拒绝我的 post 主要是代码,但这是我正在使用的测试用例:
int arr = {1,2,3,4}
nSearch(2, arr, 0, arr.length, 4);
nSearch
方法应该是二进制搜索的变体,如果有帮助的话。
I don't understand why
return i
doesn't work
没有理由认为 return
语句没有像宣传的那样工作,但在大多数情况下,程序会忽略生成的 return 值。
但请注意方法末尾的 return 0
。你认为在什么情况下执行是合适的?答案:none。我怀疑您添加它是为了清除编译器关于控制到达 non-void 方法末尾的反对意见,但如果是这样,那么您应该更深入地研究:为什么控制首先到达那个点?
考虑紧接在前的位:
if (key >= a[splitIndex]) { // if key is bigger/equal to a[splitIndex], meaning the range is 2-3 nSearch (n, a, splitIndex, a.length, key); } else { //else the range is 0-1 nSearch (n, a, 0, splitIndex, key); }
在每个分支中递归调用 nSearch()
,但是当递归调用 return 时会发生什么?没什么特别的。控制只是从那里继续,直接到那个错误的 return 0
,它产生测试器报告的 0 return 值。递归调用 returned 的任何值都将被忽略。
您方法最后几行的这种变体应该更适合您:
if (key >= a[splitIndex]) {
return nSearch(n, a, splitIndex, a.length, key);
} else {
return nSearch(n, a, 0, splitIndex, key);
}
// return 0;
你应该在从内部递归得到结果后终止递归。此外,在此 nSearch (n, a, splitIndex, a.length, key);
中,您正在检查直到 a.length
,而不管此方法调用中的实际 toIndex 是什么(fromIndex 相同)。所以以下更改应该会给你正确的答案。
if (key >= a[splitIndex]) {
return nSearch(n, a, splitIndex, toIndex, key);
}
else {
return nSearch(n, a, fromIndex, splitIndex, key);
}