理解Javascript递归

理解Javascript递归,javascript,recursion,Javascript,Recursion,我试图对递归函数进行思考,但我不理解这个示例的输出来自John Resig的《Javascript忍者》一书: var ninja = { chirp: function chirp(n) { return (n > 1) ? chirp(n-1) + "-chirp"+n : "chirp"+n; } } $('#hello').html(ninja.chirp(8)); 以及输出: 啁啾1-啁啾2-啁啾3-啁啾4-啁啾5-啁啾6-啁啾7-啁啾8 为什么氮的产量不是减

我试图对递归函数进行思考,但我不理解这个示例的输出来自John Resig的《Javascript忍者》一书:

var ninja = {
  chirp: function chirp(n) {
    return (n > 1) ? chirp(n-1) + "-chirp"+n : "chirp"+n;
  }
}

$('#hello').html(ninja.chirp(8));
以及输出:

啁啾1-啁啾2-啁啾3-啁啾4-啁啾5-啁啾6-啁啾7-啁啾8

为什么氮的产量不是减少而是增加?在我看来,输出将从8开始倒计时,而不是从1开始倒计时


它从8开始倒计时,但输出被追加到字符串的开头,然后从左到右读取输出

如果您在构建过程中看到输出,它将如下所示:

-chirp8
-chirp7-chirp8
-chirp6-chirp7-chirp8
...
chirp1-chirp2-chirp3-chirp4-chirp5-chirp6-chirp7-chirp8
因为您只看到最终输出,所以它以升序显示。

如果调用chirp1,结果将是chirp1

如果调用chirp2,结果将是chirp1+-chirp2,即chirp1-chirp2

如果调用chirp3,结果将是chirp2+-chirp3,即chirp1-chirp2-chirp3


如您所见,该函数调用自身以获取较低数字的输出,并最后添加最高数字。

我几乎可以得到它。。。我知道函数只返回一次,但输出中的n是增加的,还是返回的值被推送?@superUntitled:在递归中,通常将工作划分为更小的部分。在这种情况下,像chirp8这样的呼叫的工作分为1到7和8部分。该方法对第一部分进行递归调用,对最后一部分本身进行递归调用。结果的顺序很简单,因为这些部分是以1到7+8而不是8+1到7的形式放在一起的。所以返回的值被推送了?@Guffa得到了正确的答案。是的,每次递归调用时,字符串值都会被推送到堆栈上。追加发生在JS字符串连接代码中,而不是在jQuery.append中。