public class RecursiveLinearSearch {
public static void LinearSearch(int[] A,int l,int x,int i)
{
if (l==1)
{
if (A[i]==x)
{
System.out.println("number is at:"+i);
return;
}
else
return;
}
else
{
if (A[i]==x)
{
System.out.println("number is at:"+i);
return;
}
else
{
i=i+1;
l=l-1;
LinearSearch(A,l,x,i);
}
}
}
public static void main(String[] args) {
int[] A={1,2,3,4,6};
int l = 5;
int x = 6;
int i=0;
LinearSearch(A,l,x,i);
}
}
此递归线性搜索代码是否正确? 我是Java的新手,所以只是想确保我在正确的轨道上。如何改进这些代码?
递归线性搜索对非递归情况有什么好处?
答案 0 :(得分:0)
递归算法通常由一个或多个基本案例和递归调用组成:
在您的情况下,您只有两个基本案例,长度为零,数字位于第一个位置:
if (length == 0) {
return;
} else if (A[i]==x) {
System.out.println("number is at:"+i);
return;
} ...
(第一个基本情况也可能是长度== 1因为,最后一个元素不是你要搜索的元素)
在您的基本案例之后,如果没有基本案例,则添加递归调用:
... else {
i++;
length--;
LinearSearch(A,length,x,i);
}
结果代码看起来像这样:
public static void LinearSearch(int[] A, int length, int x, int i) {
if (length == 0) {
return;
} else if (A[i]==x) {
System.out.println("number is at:"+i);
return;
} else {
i++;
length--;
LinearSearch(A,length,x,i);
}
}
虽然我没有尝试运行此代码示例,但它应该等同于您的代码,但更清晰。
如果您想了解有关递归算法的更多信息,我建议您修改您的(或我的:)代码以使用分而治之的方法。 (减少递归调用,避免在大型数组上使用StackOverflow)
Wikipedia article on Recursion如果您还没有看过它,那么这是一个很好的起点。
避免使用一个字母变量。虽然这在编程时可能有意义,但读取代码的其他人(或稍后自己)在查看变量的使用位置和原因之前不会知道此变量包含的内容。一个很好的例子是LinearSearch方法的参数l。
LinearSearch(int[] A, int length, int x, int i)
虽然这可能部分是由于粘贴在这里引起的,但您似乎为您的程序使用了多种代码样式。这不是一个大问题,但会提高代码的可读性(因此可维护性)。
我个人更喜欢将大括号与方法或if语句放在同一行,就像你为main方法所做的那样。