Return语句在Java中不起作用
我一直在尝试一段小代码来学习java中的递归。编写了下面的方法来使用递归实现线性搜索。但是,当我使用数组和要搜索的变量作为输入调用此方法时,当该方法到达return语句时,它不会退出该方法。相反,在执行if循环中的语句后,它将再次进入else循环 我有两个问题 1) 为什么它在到达“return”时不退出该方法 2) 为什么它在执行if循环后进入else循环 我做错了什么?谁能帮我看看吗Return语句在Java中不起作用,java,generics,recursion,Java,Generics,Recursion,我一直在尝试一段小代码来学习java中的递归。编写了下面的方法来使用递归实现线性搜索。但是,当我使用数组和要搜索的变量作为输入调用此方法时,当该方法到达return语句时,它不会退出该方法。相反,在执行if循环中的语句后,它将再次进入else循环 我有两个问题 1) 为什么它在到达“return”时不退出该方法 2) 为什么它在执行if循环后进入else循环 我做错了什么?谁能帮我看看吗 linearRecursiveSearch(Constants.INPUT_INT_ARRAY, Const
linearRecursiveSearch(Constants.INPUT_INT_ARRAY, Constants.INPUT_INT_ARRAY[0], Constants.NUMBER_TO_SEARCH);
int count = 0;
public <T> void linearRecursiveSearch(T[] array,T tmp, T value) {
count++;
if (tmp == value) {
System.out.println("The value has been found");
return;
} else {
for (int i = count; i < array.length; i++) {
T tmp1 = array[i];
linearRecursiveSearch(array,tmp1, value);
}
}
}
linearRecursiveSearch(常数.INPUT\u INT\u数组,常数.INPUT\u INT\u数组[0],常数.NUMBER\u TO\u搜索);
整数计数=0;
public void linearRecursiveSearch(T[]数组,T tmp,T值){
计数++;
if(tmp==值){
System.out.println(“已找到值”);
返回;
}否则{
for(int i=count;i
1) 为什么它在到达“return”时不退出该方法
它正在退出调用return
的方法
2) 为什么它在执行if循环后进入else循环
调用return
的方法没有调用else循环。但是,还有其他方法调用,并且在调用return
的方法完成后,它们排队等待恢复
令人困惑的是,有不止一个方法调用,而且它们并不是全部调用return 也许它有助于回忆发生方法调用时发生的情况,即当前方法的状态被推送到堆栈上。然后在堆栈上为新调用保留空间,然后调用该方法。一旦该方法完成,它的状态将从堆栈中弹出。它的返回值可用,现在位于堆栈顶部的上一个方法将恢复 在递归过程中,同一方法可能会被推到堆栈上数百次。这意味着该方法可以被调用数百次,然后当堆栈展开时,每个方法将被恢复数百次。因此,仅仅因为当前调用的方法调用返回(和退出),并不意味着所有其他排队实例也将返回。事实上,这实际上意味着前面的方法(调用此方法的方法)将恢复
考虑以下版本,请注意它不包含for循环或任何全局状态:
public <T> int linearRecursiveSearch(T[] array, T targetValue) {
return linearRecursiveSearch( array, targetValue, 0 );
}
private <T> int linearRecursiveSearch(T[] array, T targetValue, int i) {
if ( i >= array.length ) {
return -1;
} else if (array[i] == targetValue) {
// == or .equals, or Comparator? task for the reader
return i;
} else {
return linearRecursiveSearch(array, targetValue,i+1);
}
}
public int linearRecursiveSearch(T[]数组,T targetValue){
返回线性递归搜索(数组,targetValue,0);
}
私有整型线性递归搜索(T[]数组,T targetValue,int i){
如果(i>=array.length){
返回-1;
}如果(数组[i]==targetValue){
//==或.equals,或Comparator?读卡器任务
返回i;
}否则{
返回线性递归搜索(数组,targetValue,i+1);
}
}
如果我了解您的问题,这可能就是解决方案
import groovy.util.logging.Slf4j
import org.junit.Test
@Slf4j
class MyTest {
@Test
public void myTest(){
int count = 0;
Integer[] input= [1,2,3,4,5,6,7]
linearRecursiveSearch(input,5,0)
}
public <T> void linearRecursiveSearch(T[] array, T value,int count) {
count++;
if (array[count] == value) {
System.out.println("The value has been found");
return;
} else {
linearRecursiveSearch(array, value,count);
}
}
导入groovy.util.logging.Slf4j
导入org.junit.Test
@Slf4j
类MyTest{
@试验
公共无效myTest(){
整数计数=0;
整数[]输入=[1,2,3,4,5,6,7]
线性递归搜索(输入,5,0)
}
public void linearRecursiveSearch(T[]数组,T值,int计数){
计数++;
if(数组[计数]==值){
System.out.println(“已找到值”);
返回;
}否则{
线性递归搜索(数组、值、计数);
}
}
}调试器对您的帮助很大-您尝试过使用调试器吗?
如果
和其他
不是循环。您需要返回一些内容(而不是void
)如果需要,可以使用break
或return
,在循环中检查此值以退出循环。传递给函数的值是什么导致函数失败?此外,您几乎肯定要使用tmp.equals(value)
(或Objects.equals(tmp,value)
)而不是==
。如果值不在数组中会发生什么?这不会终止,但如果计数达到数组的大小,您可以轻松停止递归。这只是一个关于如何重构代码以获得干净递归的示例<代码>如果(计数)