这个递归线性搜索代码是否正确?

时间:2016-09-07 14:23:11

标签: java search recursion linear

    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的新手,所以只是想确保我在正确的轨道上。如何改进这些代码?

递归线性搜索对非递归情况有什么好处?

1 个答案:

答案 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方法所做的那样。