Javascript递归->;返回跟踪是什么样子的?

Javascript递归->;返回跟踪是什么样子的?,javascript,recursion,Javascript,Recursion,所以,我刚刚开始探索递归,我对一个概念有点执着。这是一个求和数字函数(f(126)=1+2+6=9)的解I: 我追溯到基地,到目前为止一切都有意义: **Trace** f(126, 0) { sum = 6 num = 12 f(12, 6) } f(12, 6) { sum = 8 num = 1 f(1, 8) } f(1, 8) { sum = 9 num = 0 f(0, 9

所以,我刚刚开始探索递归,我对一个概念有点执着。这是一个求和数字函数(f(126)=1+2+6=9)的解I:

我追溯到基地,到目前为止一切都有意义:

**Trace**
f(126, 0)
    {
    sum = 6
    num = 12
    f(12, 6)
    }
f(12, 6)
    {
    sum = 8
    num = 1
    f(1, 8)
    }
f(1, 8)
    {
    sum = 9
    num = 0
    f(0, 9)
    }
f(0, 9) = 9
我想对我来说没有意义的是,在退绕过程中,基本案例是如何被传递回来的?它到底是如何旅行的

我期待着facepalm,但在我理解之前,我认为我无法复制此解决方案

谢谢你的帮助

我建议

function sumDigits(num) {
    if (num < 0)
        return sumDigits(Math.abs(num)) //handle negative numbers
    least_sig_digit = num % 10
    if (num < 10)
        return least_sig_digit //in case num is a float)
    else
        return least_sig_digit + sumDigits(Math.floor(num / 10))
}
函数调用按从上到下的顺序进行。 返回值自下而上冒泡,最终返回表达式
sumdights(126)
的值9

考虑递归的最佳方式是定义从一层移动到下一层的行为,而不必担心全局。只要有人告诉你
5!=5*4!,将递归概念化要容易得多


什么是数字(126)
?它是
6+sumdights(12)
。但是什么是数字(12)?它是
(6+2)+sumdights(1)
。等。

在每次调用
sumdights
时,
总和被累加并向前传递。只要第一个参数等于
0
,就会返回这个值。我发现显式写出递归很有帮助:

sumDigits(123, 0);
    return sumDigits(12, 3);
        return sumDigits(1, 5)
            return sumDigits(0, 6) // the base case (sum = 6)
                return sum;
最后一个调用返回
6
。前一个调用返回最后一个调用的结果。在此之前的调用返回最后一个调用之前的调用(依此类推)。因此,它们最终都会分解出最终的


请注意,每个调用都返回链中下一个调用的结果。阻止这种情况发生的是基本情况(即导致返回具体值的条件(即没有额外调用))。

它递归返回
sum+=num%10

另一种考虑方法是,它返回
sum
,但每次调用都会修改
sum
+=
操作符),这样当它到达基本情况时,最内层循环中
sum
的值就是实际的和。因此,只需通过所有返回返回该值

如果你只想打印,你甚至不需要归还任何东西。只需让基本案例打印sum的值并返回null


求和是在输入基本情况的过程中进行的,而不是在输出的过程中。

什么是基本情况?你的意思是
sum
?每次它触发时都要传递num和sum。对不起,我说的“base”是指“base case”(已编辑):“每当第一个参数等于0时都会返回此值”->这就是我的困惑所在。在回程中,从sumDigits(0,6)返回什么来表示sumDigits(1,5)?基本情况,对吗?但是它是如何旅行的呢?啊,太糊涂了。如果
a
返回
b
b
返回
c
c
返回
6
,那么
b
返回
6
a
返回
6
。是的,这个解决方案(aka,没有额外的sum参数)对我来说更容易理解。尽管如此,重复的sumDigits调用应该使用Math.floor(num/10)参数,而不是(num%10),对吗?这是正确的。我最初编写这个函数是为了求从最高有效位到最低有效位的数字之和,但忘记了更新代码。数字可以任意添加(RTL或LTR)。请注意,与此相反,IceArdor提供的解决方案在基本情况下进行求和。对。所以,在我最初的解决方案中,除了返回总和之外,没有任何“功”正在发生?
sumDigits(126)
= 6 + sumDigits(12)
= (6+2) + sumDigits(1)
= (6+2+1)
= 9
sumDigits(123, 0);
    return sumDigits(12, 3);
        return sumDigits(1, 5)
            return sumDigits(0, 6) // the base case (sum = 6)
                return sum;