首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何跟踪javascript中的递归而不发送计数器变量作为参数?

如何跟踪javascript中的递归而不发送计数器变量作为参数?
EN

Stack Overflow用户
提问于 2021-07-20 18:36:16
回答 2查看 76关注 0票数 0

我正在解决以下问题。

--你的一排植物被虫子感染了!每一天,受侵扰程度比左边的植物还要多的植物都会死亡。写一个函数,找出它需要多少天才能结束侵扰。

例如:如果每株植物的侵染程度为3、7、2、9、1、6、4,那么,在第一天,7、9和6级的受侵扰的植物将死亡,留下3、2、1、4。第二天,4将死亡,留下3、2、1而不会有更多的植物死亡。答案是两天。

完成下面的函数plantsDying。它必须返回天数,直到植物不再因虫害而死亡。如果一株植物的侵染数比它所剩的植物要高,它就会死亡。

@param { Array } infestedPlants -植物行的侵扰级别的数组@返回{ Number } -表示植物不再死亡的天数

下面是编写我的代码的给定函数。它不能编辑为采取更多的论点。

代码语言:javascript
运行
复制
> function plantsDying(infestedPlants) {   /* Enter your solution here!
> */ }

我用递归法解决了消灭受侵染植物的过程。但是,我无法跟踪递归发生的次数。也就是瘟疫结束的天数。为了容纳一个计数器变量,我不能更改上面给定的函数可以使用的参数数。

所以,我所做的就是在给定的函数中创建另一个函数,并传递一个计数器变量来跟踪函数调用。我能从那个计数器变量中得到正确的数字。然而,该网站说,答案是不对的。

下面是我的代码。我不知道它为什么不接受我的答案。

代码语言:javascript
运行
复制
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。

我的代码返回相同的内容,但答案没有被接受。我不确定这是因为我在内部使用了另一个函数,还是因为计数可能是错误的。这是我从问题中的解释中得出的理解。

请帮助我理解哪里出了问题,并得到正确的输出。此外,请让我知道,如果可以返回的递归计数,而不使用计数器变量。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-20 20:07:08

当您希望递归包含未在主函数签名中的变量时,一种常见的技术是有一个单独的递归函数,它确实包含这些变量,并让主函数简单地调用它,为它们提供初始值。

在编写模块很容易之前,这可能是通过内部功能完成的,如下所示:

代码语言:javascript
运行
复制
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

如今,将它们作为模块私有函数更常见,如下所示:

代码语言:javascript
运行
复制
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及其索引和数组参数编写一步删除的更简单的方法。

票数 0
EN

Stack Overflow用户

发布于 2021-07-20 19:41:51

你应该做这样的事情:

代码语言:javascript
运行
复制
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;
        }
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68459833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档