这是我当前的函数-我理解使用递归的前提,但是似乎不能让下面的函数返回元素的索引-当前返回undefined。
我的目标是创建这个函数的递归版本(使用for循环:
// function searchIndex(arr, target) {
// for(let i = 0; i < arr.length; i++) {
// if(arr[i] == target) {
// return arr.indexOf(target);
// }
// }
// return -1;
// }
我目前的代码如下:
function searchRecursive(arr, target) {
// base case
if (arr[0] === target) {
return 0;
}
else {
searchRecursive(arr.slice(1), target)
}
}
3条答案
按热度按时间yc0p9oo01#
当前的代码有两个主要问题,第一个问题是在基本情况下只使用
return
,这意味着递归调用的值不会在else
中返回:在
else
中添加一个return
并不能简单地解决这个问题,因为现在你只返回0
,但是你可以在每次递归时添加1
,以表明你正在数组中搜索一个额外的索引。第二个问题是你还需要考虑到你找不到你的
target
值的情况,以避免无限递归和意外地超过调用栈的最大限制,为此,你可以添加一个检查,当数组长度是0
时,如果你还没有找到你要找的项,就返回-1
:或者,您可以使用tail recursion,通过添加一个额外的参数来跟踪您当前正在查看的索引,而不是切片。这允许您避免为每个递归调用创建新数组,并针对尾部调用优化的引擎和转发器进行了优化(据我所知,这只是Safari/WebKit)如果你担心性能,那么就用迭代方法来代替:
yquaqz182#
这里你有一个递归的相同函数
oyt4ldly3#
现在你已经差不多做到了,你只需要返回递归调用,同时给它加1:
但是,这种方法不是很节省内存。每次调用函数时,都会复制一个数组(不包括第一个元素),因为
.slice()
总是返回一个全新的数组。这种复制对于您的用例来说是完全没有必要的。考虑到传统for循环的一般方法,您可以使用“迭代器”来跟踪您在数组中的位置。
我还添加了一个检查,检查原始数组的长度是否为零,如果为零,则函数不需要做任何工作,可以立即返回
-1
。