在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 :(得分:3)
首先,find dir -name '*.js'
是一个有效的索引,是数组中的第一个索引。如果您已在基本情况下离开数组末尾,请返回0
以表示"未找到"。此外,当-1
到达index
时,您已离开数组的末尾,而不是在data.length
已过时,因此您需要更改data.length
条件这里。
其次,递归调用会发送相同的参数,如果在初始递归调用中找不到if
,则会导致无限循环。您希望在下一个递归调用中查看下一个索引,因此在再次调用value
时,请传递index + 1
而不是index
。
答案 1 :(得分:0)
好吧,当你想做一个递归方法时,你需要两件事:
一个基本案例
(在您的方法中,这是index == data.length
和index == value
)。
如果实际调用中的值不是基本情况,则为递归调用。
然后在您的方法中,您必须使用正在递增或递减的变量的新值为您的方法执行新调用。
在您的情况下,此变量为index
。
嗯,有了这一切,你必须考虑:
您的代码将是这样的:
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);
}
}
答案 2 :(得分:0)
在递归中,您将问题划分为较小的类似问题,直到您达到方法/功能不再需要调用自身的程度。在我的 contains 版本中,如下所示,每次调用该方法时,它都会检查它是否超过了数组的末尾("在&#34之前;第一个元素)或者已发现值。如果不是,则该方法调用自身以查找结果。如果找不到元素,该方法返回 -1 - 这可能是一个合适的选择,因为没有数组元素在索引-1处。此外,应该使用 data - 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 );
}