【问题标题】:Why is this recursion example giving me an infinite loop?为什么这个递归示例给了我一个无限循环?
【发布时间】:2021-05-04 19:56:25
【问题描述】:

这让我发疯了。 这是代码:

function laugh(){
  let counter = 10; 
  if(counter <= 0){
    return;
  } 
  else{
    console.log('laugh'); 
    counter--; 
    laugh()
  }
}

当它应该打印 'laugh' 10 次时,为什么这给了我一个无限循环?

【问题讨论】:

  • 您应该在函数之外定义counter。这样它总是 10。

标签: javascript algorithm recursion


【解决方案1】:

你已经在函数内部定义了计数器,所以每次调用函数时它都会重置为10。

let counter = 10; 
function laugh(){
  if(counter <= 0){
    return;
  } 
  else{
    console.log('laugh'); 
    counter--; 
    laugh();
  }
}
laugh();

【讨论】:

    【解决方案2】:

    变量counter 应该是全局变量。此时,无论何时调用该函数,那么counter总是会被声明并初始化为10。

    【讨论】:

      【解决方案3】:

      就像其他答案所说,每个laugh() 都创建了一个新的本地计数器。

      这里最合适的递归方法是将计数器作为参数传递:

      function laugh(counter){
        if(counter <= 0){
          return;
        } 
        else{
          console.log('laugh'); 
          laugh(counter - 1) // subtract 1 from the counter and recur
        }
      }
      
      laugh(10)

      这是一种纯函数方法,减少了对可能受其他函数影响的全局变量的依赖。与不需要时使用全局变量相比,这通常是一种更安全的编程方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多