向后递归线性搜索

Posted

技术标签:

【中文标题】向后递归线性搜索【英文标题】:Backward Recursive Linear Search 【发布时间】:2015-10-26 22:52:19 【问题描述】:

我正在尝试编写一个函数,通过修改线性搜索函数来查找向量中目标的最后一次出现。

private int linearSearchRecursive(int[] input, int key,int index) 
    if (index == 0) 
        return -1;
    
    if (input[index] == key) 
        return index;
    
    else 
    return linearSearchRecursive(input,key,--index);

我想到了一种方法,通过使用辅助函数来使它工作......

public static int findLastOccurance(int[] items, int key)
    return linearSearchRecursive(items, key, items.length - 1);

或类似性质的东西,但想知道是否有更简单的方法可以只使用一个函数但保持递归性?

【问题讨论】:

如果您要从最后开始评估每个条目,我不明白您为什么首先要为递归而烦恼。这是一种非常迭代的方法,在这种特定情况下,递归只会带来开销和混乱。 @Joffrey 我完全同意,但它是我即将提出的测试审查的一部分,所以我试图弄清楚类似的事情可能会出现在测试中。 【参考方案1】:

并不简单,但只有一个功能:

public class Test 

public static int findLastOccuranceRecursive(int[] input, int key, int... optionalIndex) 
    if (optionalIndex.length == 0) 
        optionalIndex = new int[]  input.length - 1 ;
     else if (optionalIndex.length != 1) 
        throw new IllegalArgumentException("size of optionalIndex must be 0 or 1");
    

    if (optionalIndex[0] == 0) 
        return -1;
    
    if (input[optionalIndex[0]] == key) 
        return optionalIndex[0];
     else 
        optionalIndex[0]--;
        return findLastOccuranceRecursive(input, key, optionalIndex);
    


public static int findLastOccuranceIterative(int[] items, int key) 
    for (int i = items.length - 1; i >= 0; i--) 
        if (items[i] == key) 
            return i;
        
    
    return -1;


public static void main(String[] args) 
    int[] input =  1, 1, 1, 2, 1, 2, 1, 1 ;
    int testRecursive = findLastOccuranceRecursive(input, 2);
    int testIterative = findLastOccuranceIterative(input, 2);
    System.out.println("testRecursive: " + testRecursive + " testIterative: " + testIterative);


【讨论】:

以上是关于向后递归线性搜索的主要内容,如果未能解决你的问题,请参考以下文章

使用 Javascript 递归地进行线性搜索

C 调试中的递归线性搜索

递归线性搜索的复杂性是多少(使用分而治之的技术)?

搜索分析(DFSBFS递归记忆化搜索)

向后搜索视觉模式选择

Flex Spark VideoDisplay:倒带向后搜索