【问题标题】:Need somebody to explain a simple question concerning loops需要有人解释一个关于循环的简单问题
【发布时间】:2020-12-17 19:26:04
【问题描述】:
function foo(i) 
  {
  if (i < 0) return; 
  console.log('begin: ' + i); 
  foo(i - 1); 
  console.log('end: ' + i); 
} 
foo(3);

这段代码打印出来:

begin: 3 
begin: 2 
begin: 1 
begin: 0 
end: 0 
end: 1 
end: 2 
end: 3

我了解开始结果的工作原理。
我只是无法理解“结束:”行背后的逻辑。
为什么它又从零开始计数到 ​​3,这对我来说没有任何意义。
有人请给我解释一下代码我是新手

【问题讨论】:

  • 代替控制台日志,在浏览器中设置断点并检查发生了什么。
  • 因为这是递归的,所以你并没有真正循环。您到达最后一项,然后在每个递归调用开始退出时开始输出end 值。递归函数将退出调用它们的相反顺序(堆栈顺序)。
  • foo(3) 可以结束之前,它必须执行foo(2)。但在foo(2) 可以结束之前,它必须执行foo(1)。但在foo(1) 可以结束之前,它必须执行foo(0)foo(0) 运行,执行 foo(-1),它只做 return,并打印 end: 0。现在,foo(1) 可以通过记录 end: 1 来结束。现在foo(2) 可以通过记录end: 2 来结束...你明白了

标签: javascript function loops if-statement


【解决方案1】:

使用递归实际上不会导致函数循环,相反,它只是将当前调用添加到“堆栈”并继续执行下一个函数。为简化起见,您可以将其视为每次调用递归时几乎相互嵌套的函数。由于您在每次记录之前进行递归调用,因此当前正在运行的函数本质上会暂停,并添加到堆栈中,直到下一个函数完成运行。这将一直持续到所有函数都到达该递归点并调用它,然后堆栈将以相反的顺序清空,完成每个函数直到堆栈为空。

【讨论】:

    【解决方案2】:

    函数在调用其他函数或自身时不会终止。当一个函数调用另一个函数时,暂停当前函数的执行,并将其内容和返回地址存储在某个堆栈中,并开始执行被调用函数。当被调用函数完成它的操作时,控制权被传递回调用函数,调用函数的执行被恢复并从内存中获取它的内容。

    【讨论】:

      猜你喜欢
      • 2021-12-16
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2011-08-14
      • 1970-01-01
      • 2019-09-14
      • 2016-08-10
      相关资源
      最近更新 更多