我正在解决以下问题。
--你的一排植物被虫子感染了!每一天,受侵扰程度比左边的植物还要多的植物都会死亡。写一个函数,找出它需要多少天才能结束侵扰。
例如:如果每株植物的侵染程度为3、7、2、9、1、6、4,那么,在第一天,7、9和6级的受侵扰的植物将死亡,留下3、2、1、4。第二天,4将死亡,留下3、2、1而不会有更多的植物死亡。答案是两天。
完成下面的函数plantsDying。它必须返回天数,直到植物不再因虫害而死亡。如果一株植物的侵染数比它所剩的植物要高,它就会死亡。
@param { Array } infestedPlants -植物行的侵扰级别的数组@返回{ Number } -表示植物不再死亡的天数
下面是编写我的代码的给定函数。它不能编辑为采取更多的论点。
> function plantsDying(infestedPlants) { /* Enter your solution here!
> */ }
我用递归法解决了消灭受侵染植物的过程。但是,我无法跟踪递归发生的次数。也就是瘟疫结束的天数。为了容纳一个计数器变量,我不能更改上面给定的函数可以使用的参数数。
所以,我所做的就是在给定的函数中创建另一个函数,并传递一个计数器变量来跟踪函数调用。我能从那个计数器变量中得到正确的数字。然而,该网站说,答案是不对的。
下面是我的代码。我不知道它为什么不接受我的答案。
function plantsDying(infestedPlants) {
/* Enter your solution here! */
function recurseee(infestedPlants,count){
var stack = []
count++
for(i=0;i<infestedPlants.length;i++){
if(infestedPlants[i+1]){
if(infestedPlants[i+1]>infestedPlants[i])
{
stack.push(infestedPlants[i])
i++
}
else{
stack.push(infestedPlants[i])
}
}
else{
stack.push(infestedPlants[i])
}
}
if(stack.length == infestedPlants.length)
count =1
else
count++
console.log(stack)
if(stack.length>0){
for(i=0;i<stack.length;i++){
if(stack[i+1])
{
if(stack[i]<stack[i+1])
{
count++
stack = recurseee(stack, count)
}
}
}
}
return(count)
}
var count = 0
var res = recurseee( infestedPlants,count )
return res
}
var daysPassed = plantsDying([1,2,3,4,5,6,7])
console.log(daysPassed)
对于此输入1,2, 3,4, 5,6,7,在每次递归调用中消除后的相应剩余植物为1,3,5,71,并计数或经过的天数为3。
我的代码返回相同的内容,但答案没有被接受。我不确定这是因为我在内部使用了另一个函数,还是因为计数可能是错误的。这是我从问题中的解释中得出的理解。
请帮助我理解哪里出了问题,并得到正确的输出。此外,请让我知道,如果可以返回的递归计数,而不使用计数器变量。
谢谢!
发布于 2021-07-20 20:07:08
当您希望递归包含未在主函数签名中的变量时,一种常见的技术是有一个单独的递归函数,它确实包含这些变量,并让主函数简单地调用它,为它们提供初始值。
在编写模块很容易之前,这可能是通过内部功能完成的,如下所示:
const plantsDying = (infested) => {
const recur = (infested, count) => {
const afterRemoval = infested .filter ((x, i, a) => i == 0 || a [i - 1] >= x)
return afterRemoval .length == infested .length
? count
: recur (afterRemoval, count + 1)
}
return recur (infested, 0)
}
console .log (plantsDying ([3, 7, 2, 9, 1, 6, 4])) //=> 2
console .log (plantsDying ([5, 4, 3, 2, 1])) //=> 0
如今,将它们作为模块私有函数更常见,如下所示:
const dying = (infested, count) => {
const afterRemoval = infested .filter ((x, i, a) => i == 0 || a [i - 1] >= x)
return afterRemoval .length == infested .length
? count
: dying (afterRemoval, count + 1)
}
const plantsDying = (infested) =>
dying (infested, 0)
// or whatever
// module .exports = {plantsDying, /* ... */}
console .log (plantsDying ([3, 7, 2, 9, 1, 6, 4])) //=> 2
console .log (plantsDying ([5, 4, 3, 2, 1])) //=> 0
在这两种情况下,请注意,这也显示了使用.filter
及其索引和数组参数编写一步删除的更简单的方法。
发布于 2021-07-20 19:41:51
你应该做这样的事情:
const remove_dead = (arr) => {
const new_arr = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] <= arr[i - 1]) {
new_arr.push(arr[i])
}
}
return new_arr;
};
const plants_dying = (plants) => {
if (plants.length === 0) {
return 0;
}
let count = 0;
while (true) {
const new_array = remove_dead(plants);
if (new_array.length == plants.length) {
return count;
} else {
count++;
plants = new_array;
}
}
};
https://stackoverflow.com/questions/68459833
复制相似问题