目标是获得数组中的最大值。我希望有人能引导我了解我的代码出了什么问题以及如何使它工作。
我要完成的工作是从预设数组开始,先比较Arr[i]
和Arr[i+1]
,然后比较Arr[i+1]
和Arr[i+2]
,依此类推...将每个值的最大值推入一个称为Arrl
的空数组中。然后将Arr设置为Arrl
。然后回调该函数,并重复直到只剩下Arr[0]
并显示结果。
这是我到目前为止的代码:
var Arr=[10,56,76,98,82,45,98];
function largernumber(Arr){
var Arrl=[];
while (Arr.length>1);
for (i=0; i<Arr.length; i++){
if(Arr[i]>Arr[i+1] || Arr[i]===Arr[i+1]){
Arrl.push(Arr[i]);
}
else{
ArrL.push(Arr[i+1]);
}
console.log(Arrl);
}
for(var ar=0 ; ar<Arrl.length ; ar++){
Arr[ar]=Arrl[ar];
}
return largernummber(Arr);
}
我不太擅长描述,因此我将尝试展示我的计划。
var Arr=[10,56,76,98,82,45,98]
(每次通过数组后,长度将减少一)
第一次通过
var Arr=[60,76,98,98,82,98]
第二名
var Arr=[76,98,98,98,98]
第三名
var Arr=[98,98,98,98]
n ..
var Arr=[98]
目前,我的逻辑是如此有缺陷,它冻结了浏览器。糟糕...如果可能的话,我也很想知道可以在哪里放置控制台日志以查看每次迭代。
最佳答案
尽管所有其他答案都已为您的问题指出了完全正确且实际上更简单的解决方案,但我只是“修复”您的代码以使用您提到的算法。我避免了不必要的代码更改。
除了变量名中的拼写错误外,这些还与代码本身有关:while (Arr.length > 1);
永远循环。我认为这是试图找到递归的基本情况。它应该是if (Arr.length === 1) return Arr[0];
,它表示“如果只剩一个元素,那是最大的元素并返回它”。
访问数组中的第i + 1
个元素时,请始终注意访问最后一个元素。在您的情况下,最后一次迭代的循环将一直循环到i < Arr.length
和i + 1 === Arr.length
,从而导致undefined
。将数字与undefined
won't work进行比较。因此,请确保使用Arr.length - 1
循环到最后一个元素。
最后,您实际上不会将新创建的数组用于递归的下一个分支。您需要将return largernumber(Arr);
更改为return largernumber(Arrl);
var Arr = [10, 56, 76, 98, 82, 45, 98];
function largernumber(Arr) {
var Arrl = [];
if (Arr.length === 1) { return Arr[0] };
for (i = 0; i < Arr.length - 1; i++) {
if (Arr[i] > Arr[i + 1] || Arr[i] === Arr[i + 1]) {
Arrl.push(Arr[i]);
} else {
Arrl.push(Arr[i + 1]);
}
}
for (var ar = 0; ar < Arrl.length; ar++) {
Arr[ar] = Arrl[ar];
}
return largernumber(Arrl);
}
console.log(largernumber(Arr));
您可能已经注意到,第1点和第3点指出了无限递归的位置。