我有简单的数组[3,7,9],我尝试递归搜索某些值。如果要搜索的值不存在,则将其添加到数组中,否则不会。我正在使用开关盒结构,但面临严重的问题。
首先搜索价值2.在返回函数之前一切正常。由于某种原因,代码跳回到休息状态; -line in“case a:”然后将itemFound设置为'undefined'。为什么会发生这种跳跃?
搜索值5跳回到休息状态;在“案例b:”中,itemFound再次获得值“未定义”。
使用其他值时,会有更多跳跃。
我确实希望代码只做一个switch-case并退出条件。
myArr = [3, 7, 9];
window.onload = init;
function init() {
searchItem(myArr, 2);
searchItem(myArr, 5);
searchItem(myArr, 8);
searchItem(myArr, 10);
searchItem(myArr, 7);
var arrLength = myArr.length;
for (var i = 0; i < arrLength; i++) {
console.log('index ' + i + ' ' + myArr[i]);
// alert(myArr);
}
}
function searchItem(array, itemToSearch) {
var itemFound;
var itemArray = array.slice(0);
var arrLen = itemArray.length;
var midPointIndex = Math.round(itemArray.length / 2) - 1;
var midPointVal = itemArray[midPointIndex];
switch (true) {
//case a:
case midPointVal < itemToSearch:
if (arrLen > 1) {
itemArray.splice(0, midPointIndex + 1);
searchItem(itemArray, itemToSearch);
} else {
itemFound = false;
}
break;
//case b:
case midPointVal > itemToSearch:
if (arrLen > 1) {
itemArray.splice(midPointIndex, arrLen - midPointIndex);
searchItem(itemArray, itemToSearch);
} else {
itemFound = false;
}
break;
//case c:
case midPointVal === itemToSearch:
itemFound = true;
break;
}
if (itemFound === false) {
myArr.push(itemToSearch);
myArr.sort();
//arraySort(myArr);
}
console.log('Value ' + itemToSearch + ' found' + ': ' + itemFound);
return itemFound;
}
答案 0 :(得分:0)
由于某种原因,代码跳回到休息状态; -line in&#34; case a:&#34;然后将itemFound设置为&#39; undefined&#39;。为什么会发生这种跳跃?
因为return
在调用堆栈上跳回一级。您没有在函数内部跳转,而是从递归调用跳转到调用它 - 以及itemFound
仍然未定义。
我尝试递归搜索某些值。如果要搜索的值不存在,则将其添加到数组中,否则不会。
myArr.push(itemToSearch);
确实将项目添加到一个完全不同的数组中 - 幸运的是你最初传入的数组,但它仍然是一个不好的做法。相反,如果你只是在itemArray
的预期位置添加它会更有效 - 你甚至已经知道它需要插入什么位置,所以之后不需要.sort()
。 / p>
但是,您的递归实现会复制(切片)和修改(拼接)数组,这使得无法将其简单地添加到当前数组中。相反,保持数组完整,并使用两个变量/参数leftIndex
和rightIndex
进行搜索。