Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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
Java递归,返回数组索引_Java_Recursion - Fatal编程技术网

Java递归,返回数组索引

Java递归,返回数组索引,java,recursion,Java,Recursion,在Java中,我想创建一个递归方法,在数组中查找特定的整数,当找到它时,返回数组索引 到目前为止,我的代码是: private static int contains(int[] data, int value, int index) { if (index >data.length) { return 0; } if(data[index] == value) { return index;

在Java中,我想创建一个递归方法,在数组中查找特定的整数,当找到它时,返回数组索引

到目前为止,我的代码是:

private static int contains(int[] data, int value, int index) 
{
     if (index >data.length)
     {
         return 0;
     }
     if(data[index] == value)
     { 
         return index;
     }
     else
     {
         return contains(data,value,index);
     }
}   

该方法没有返回正确的索引。我做错了什么?

首先,
0
是一个有效的索引,数组中的第一个索引。如果您在基本情况下离开了数组的末尾,请返回
-1
,以指示“未找到”。另外,当
索引
到达
data.length
时,而不是当它传递
data.length
时,您已经离开了数组的末尾,因此您需要在此处更改
if
条件


其次,递归调用发送相同的参数,如果在初始递归调用中找不到
,将导致无限循环。您希望在下一次递归调用中查看下一个索引,因此在再次调用
contains
时传递
index+1
而不是
index

好吧,当您想要执行递归方法时,需要两件事:

  • 基本情况 (在您的方法中,这是当
    index==data.length
    index==value
    时)

  • 如果实际调用中的值不是基本情况,则为递归调用

  • 然后,在方法内部,您必须使用递增或递减的变量的新值对方法进行新调用。 在您的情况下,此变量是
    索引

    好吧,有了这些,你必须想:

  • 如果我从一个基本案例开始我的方法是否有效
  • 如果我以无基本情况开始,则后续调用将转到基本情况
  • 您的代码如下所示:

           private static int contains(int[] data, int value, int index){
    
     if(index == data.length) {
          return -1;
      }else if (data[index] == value){
          return index;
       }else{
          return contains(data,value,index+1);
              }
        }   
    

    在递归中,您将问题划分为更小的类似问题,直到达到方法/函数不能或不需要再调用自身的点为止。在下面给出的我的包含的版本中,每次调用该方法时,它都会检查它是否超过数组的末尾(“在”第一个元素之前),或者是否找到了值的出现。如果不是,则该方法调用自身以查找结果。如果找不到元素,该方法将返回-1——这是一个合适的选择,因为索引-1处没有数组元素。此外,调用该方法时,应将数据-1的长度作为第三个参数

    private static int contains( int[] data, int value, int index )
    {
        /* Base cases - end of recursion: */
        if ( ( index == -1 ) || ( data[ index ] == value ) )
        {
            return index;
        }
    
        /* Recursion: */
        return contains( data, value, index - 1 );
    }