返回法规不适用于Java

时间:2015-10-15 13:17:53

标签: java generics recursion

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

我有两个问题。

1)为什么没有退出'返回'的方法?

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);
        }
    }
}

2 个答案:

答案 0 :(得分:6)

  

1)为什么没有退出达到&#39; return&#39; ?

退出调用return的方法。

  

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

调用return的方法不是调用else循环。但是,该方法还有其他调用,并且在调用return的方法完成后,它们排队等待恢复。

混淆的一点是,该方法有多个调用,并且它们都不是全部调用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);    
    }
}

答案 1 :(得分: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);

    }
}

}