Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Return语句在Java中不起作用_Java_Generics_Recursion - Fatal编程技术网

Return语句在Java中不起作用

Return语句在Java中不起作用,java,generics,recursion,Java,Generics,Recursion,我一直在尝试一段小代码来学习java中的递归。编写了下面的方法来使用递归实现线性搜索。但是,当我使用数组和要搜索的变量作为输入调用此方法时,当该方法到达return语句时,它不会退出该方法。相反,在执行if循环中的语句后,它将再次进入else循环 我有两个问题 1) 为什么它在到达“return”时不退出该方法 2) 为什么它在执行if循环后进入else循环 我做错了什么?谁能帮我看看吗 linearRecursiveSearch(Constants.INPUT_INT_ARRAY, Const

我一直在尝试一段小代码来学习java中的递归。编写了下面的方法来使用递归实现线性搜索。但是,当我使用数组和要搜索的变量作为输入调用此方法时,当该方法到达return语句时,它不会退出该方法。相反,在执行if循环中的语句后,它将再次进入else循环

我有两个问题

1) 为什么它在到达“return”时不退出该方法

2) 为什么它在执行if循环后进入else循环

我做错了什么?谁能帮我看看吗

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)
)而不是
==
。如果值不在数组中会发生什么?这不会终止,但如果计数达到数组的大小,您可以轻松停止递归。这只是一个关于如何重构代码以获得干净递归的示例<代码>如果(计数)