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

Posted

技术标签:

【中文标题】使用 Javascript 递归地进行线性搜索【英文标题】:Linear Search Recursively using Javascript 【发布时间】:2019-02-10 19:46:13 【问题描述】:

我正在尝试使用 javascript 递归地实现线性搜索。

Given Array A = [1,2,3,4,5,6]

函数签名 - 类似这样:

LinearSearchRecursively(ArrayGiven, x, startingValue) 

如果找到值则返回索引,否则返回-1,但递归实现。

如果你能附上一个正在运行的 jsbin 或 jsfiddle 将不胜感激。

【问题讨论】:

【参考方案1】:

您可以使用数组解构来获取数组的头部和尾部。

然后你比较头部,如果它等于你的值,则返回到目前为止的索引,否则,你调用递归函数,尾部和索引递增。

您的停止条件是数组为空时,在这种情况下您返回 -1。

在这里,我将递归函数及其调用包装在一个外部函数中,该函数具有更好的 API,没有索引。

function linearSearch(arr, value) 
  function linearSearchRec(list, idx) 
    if (!list.length) return -1;
    const [head, ...tail] = list;
    if (value === head) return idx;
    else return linearSearchRec(tail, idx + 1);
  
  return linearSearchRec(arr, 0);


console.log(linearSearch([1,2,3,4,5,6], 1));
console.log(linearSearch([1,2,3,4,5,6], 4));
console.log(linearSearch([1,2,3,4,5,6], 10));

【讨论】:

【参考方案2】:

您可以更改函数的签名,因为搜索函数的调用应该是可能的,而无需使用初始索引进行搜索。

function linearSearchRecursively(a, x, i = 0) 
    if (i >= a.length) return -1;
    if (a[i] === x) return i;
    return linearSearchRecursively(a, x, i + 1);


console.log(linearSearchRecursively([1, 2, 3, 4, 5, 6, 7], 7));
console.log(linearSearchRecursively([1, 2, 3, 4, 5, 6, 7], 9));
console.log(linearSearchRecursively([], 7));

另一种解决方案是对数组使用解构并检查第一个元素。

function linearSearchRecursively([a, ...rest], x, i = 0) 
    if (a === x) return i;
    if (!rest.length) return -1;
    return linearSearchRecursively(rest, x, i + 1);


console.log(linearSearchRecursively([1, 2, 3, 4, 5, 6, 7], 7));
console.log(linearSearchRecursively([1, 2, 3, 4, 5, 6, 7], 9));
console.log(linearSearchRecursively([], 7));

【讨论】:

【参考方案3】:

我会这样做:这是 jsbin 链接:

https://jsbin.com/lijitet/8/edit?js,console

/**
 * Linear Search : Recursion
 * Returns index if found -1 otherwise
 * Procedure LinearSearch(Array A, int x, int i)
 * n = A.length and i is starting position of array
 * if (A[i] === x) return i
 * if (i > n) LinearSearch(A, x, i++)
  * 
  */
 function LinearSearchRecursively(ArrayGiven, x, i) 
     const arrayLength = ArrayGiven.length;

     if (i > (arrayLength - 1)) 
       return -1;
     
     if(ArrayGiven[i] === x) 
       return i;
     
     return LinearSearchRecursively(ArrayGiven, x, i+1); 
 

 // write your test cases here :
 const testArray = [ 1, 2, 3, 4, 5, 6, 7];

 console.log(`Missing Element : $LinearSearchRecursively(testArray, 7, 0)`);

请随意添加。谢谢。

【讨论】:

【参考方案4】:
let i = 0 
let recursiveSearch = (array, element) =>      
    if(i >= array.length) return 'Not found'    
    if(array[i] == element) return i 
    else     
        i = i+1
        return recursiveSearch(array, element)
    


console.log(recursiveSearch([1,5,3,4],4)) // index 3
console.log(recursiveSearch([1,5,3,4,10,20],5)) //index 2
console.log(recursiveSearch([1,5,3,4,10,20],50)) // Not found

【讨论】:

虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的答案添加解释并说明适用的限制和假设。

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

JavaScript中嵌套对象结构中的递归树搜索

向后递归线性搜索

运行递归线性搜索时出现堆栈溢出错误

JavaScript中数组元素的线性搜索

C 调试中的递归线性搜索

Lambda 搜索 VS 线性搜索