Recursion “和”之间有什么区别;递归&引用;一种非终止过程,它恰好引用自身;,及;重复调度“;?

Recursion “和”之间有什么区别;递归&引用;一种非终止过程,它恰好引用自身;,及;重复调度“;?,recursion,language-agnostic,scheduling,procedure,Recursion,Language Agnostic,Scheduling,Procedure,该问题旨在作为消除描述性术语“递归”或“递归”歧义的规范性问题/答案。在适用的范围内,“一个恰好是指自身的非终止程序”和“重复调度” 在JavaScript中,定义和区别是什么 “递归” “一个恰好引用自身的非终止过程”;及 “重复调度” 我经常看到函数重复调用自身时使用的术语“递归”,不过JavaScript中“递归”的明确定义是什么 我很少看到在描述函数模式时使用的术语“一个碰巧涉及自身的非终止过程”或“重复调度”;通常使用“递归”或“递归”来描述一种模式,其中在函数调用体中,对开始该过程

该问题旨在作为消除描述性术语“递归”或“递归”歧义的规范性问题/答案。在适用的范围内,“一个恰好是指自身的非终止程序”和“重复调度”


JavaScript
中,定义和区别是什么

  • “递归”
  • “一个恰好引用自身的非终止过程”;及
  • “重复调度”
  • 我经常看到函数重复调用自身时使用的术语“递归”,不过
    JavaScript
    中“递归”的明确定义是什么

    我很少看到在描述函数模式时使用的术语“一个碰巧涉及自身的非终止过程”或“重复调度”;通常使用“递归”或“递归”来描述一种模式,其中在函数调用体中,对开始该过程的原始函数进行函数调用


    当“递归”不适用于特定的函数模式时;“递归”、“一个恰好引用自身的非终止过程”和“重复调度”之间的明确定义和区别是什么

    我经常看到函数重复调用自身时使用的术语“递归”,不过JavaScript中“递归”的明确定义是什么

    这个定义看起来很好,但是函数不必直接调用自己来实现递归,它的执行只需要导致再次调用它。函数不直接调用自身的递归示例是:调用
    A()调用
    B()调用
    C()调用
    A()再次

    重复调度

    这样的函数使用重复调度:

    function A ( foo ) {
      var bar;
      setTimeout( A, 0 );
      console.log( 'hello' );
    }
    
    它不是递归的,因为不会在同一调用堆栈上重复调用。当当前调用堆栈完成(这意味着“hello”将被记录)并且在事件循环中再次调用A之前没有任何其他内容时,将调用A。除了同步代码和异步代码之间的区别之外,这里重要的区别在于一次只有一个
    foo
    bar
    副本,并且调用堆栈没有增长,因此不会出现内存或最大调用堆栈大小超过错误,对于这个使用递归的版本会有:

    function A ( foo ) {
      var bar;
      A();
      console.log( 'hello' );
    }
    
    在这种情况下,“hello”将永远不会被打印,因为
    A
    在到达日志语句之前会调用自身

    引用自身的非终止过程

    非终止过程只是一个无限循环。提到它本身有些毫无意义:

    function A ( ) {
        // Never terminates
        while ( true ) {
            // If A() is called here, or before
            // the loop you have infinite 
            // recursion and a stack size error
        }
        // If, instead, A() is called here,
        // you just have an infinite-loop,
        // since this statement is never reached
    }
    

    第三个示例与第一个示例有何不同,第一个示例避免了堆栈大小错误,例如在
    while
    语句中的某个点使用
    break
    ,并且在
    while
    循环之后调用
    A()
    ?在将来的某个时刻对原始函数的异步调用仍然是递归吗?或者,在再次调用原始函数之前,当函数调用包括异步函数调用时,是否有不同的计算方法?第三个示例与递归没有区别,如果添加了中断和
    a()在循环后调用。堆栈大小将发生错误。@guest271314这将被重复调度,因为
    然后
    异步调用函数。
    doAsynchronousStuff
    中唯一同步的东西是return语句,它调用Promise构造函数,调用传递给它的函数,调用setTimeout。其他一切都是异步的。@guest271314它只取决于函数在再次调用之前是否返回
    isEven
    可以在返回之前调用自身(例如
    isEven(2)
    在返回之前调用
    isEven(0)
    ),因此它是递归的
    doAsynchronousStuff
    立即返回一个承诺,因此当再次异步调用时,它已经返回并且不再位于调用堆栈上。“函数是否递归的度量直接取决于函数本身是否放置在调用堆栈中?”是。“不是函数是否返回异步结果?”正确。“或者,是否所有异步函数都未放在调用堆栈上?或者调用的异步函数是否已从调用堆栈中删除?”它们未放在现有调用堆栈上,但它们将在以后某个时间点作为新调用堆栈的开始,在当前调用堆栈完成之后,它们是事件循环队列中的下一个。为什么您认为它的定义在JavaScript中会有所不同?