不完全理解递归函数

时间:2018-04-16 01:56:27

标签: javascript recursion

我正在为Hack Reactor做面试准备练习。其中一个分配是编写一个可以在不使用乘法运算符的情况下乘以两个数的函数。我能够但代码很长而且很笨重,我在github上找到了一个更好的解决方案:

var output = multiply(4, 7);

function multiply(num1, num2) {
  if(num2 === 0) { 
    return 0;
  }
  if(num2 > 0 ) {    
    return (num1 + multiply(num1, num2-1));
  }
  if(num2 < 0 ) {
    return -multiply(num1, -num2);
  }
}  


console.log(output);

我不完全了解此代码的工作原理。我知道它是递归的并处理3种不同的情况。当两个输入均为正数时,该函数将自身的递归调用添加到num1,第一个输入保持不变,同时从第二个输入减去1。这是有道理的,但我没有得到的是,最终num2达到0但函数没有返回0.我可以通过在函数的第一行添加console.log语句来看到这一点,那么它是如何工作的? 此外,我无法弄清楚如何添加一个console.log来跟踪函数的返回值,因为它一遍又一遍地调用它自己。我想它看起来像是:

4
4 + multiply(num1, num2-1)
8 + multiply(num1, num2-1)
12 + multiply(num1, num2-1)

但我无法让它发挥作用。谢谢!问题编号是模块1练习141'乘法' 感谢任何和所有帮助!

4 个答案:

答案 0 :(得分:1)

不确定我的问题是否正确。但是你不需要了解递归内部的内容。

if(num2 === 0) { 
    return 0;
  }

这是你的基本情况。因此,如果您致电var output = multiply(4, 0);,它将返回0。

这是你如何说一个递归函数停止。

视觉上应该是这样的:

  

4 +乘(4,6)+ 4 +乘(4,5)+ 4 +乘(4,4)+ 4 +乘(4,3)+ 4 +乘(4,2)+ 4 +乘以(4,1)+ 4 + 0(你的基本情况)

所以你留下:4 + 4 + 4 + 4 + 4 + 4 + 4 = 28

我认为理解它的最简单方法是查看参数。你的num1是你加起来的数字。你的num2是你添加num1的次数。这是您的计数器,按降序排列,直到达到0的基本情况。

答案 1 :(得分:1)

这是它下面的工作方式,它一直持续到num2 = 0,在这种情况下它返回0.

乘以(4,7)

4 +乘(4,6)

4 +乘(4,5)

4 +乘(4,4)

4 +乘(4,3)

4 +乘(4,2)

4 +乘(4,1)

4 +乘(4,0)

所以4 +乘(4,0)= 4。

4 +乘(4,1)将= 8.继续向上,最终我们有:

乘(4,7)= 28

4 +乘(4,6)= 24

4 +乘(4,5)= 20

4 +乘(4,4)= 16

4 +乘(4,3)= 12

4 +乘(4,2)= 8

4 +乘(4,1)= 4

4 +乘(4,0)= 0

答案 2 :(得分:0)

代码函数递归。例如,我们将确定

multiply(4,3)

使它递归的原因是它实际计算的第一件事是 multiply(4,0)返回4。 确定后,可以按顺序确定以下内容

multiply(4,1)

multiply(4,2)

您不能单独获得乘法(4,3)的返回值。如果您取出第1和第3个if语句,则不应返回任何内容。

答案 3 :(得分:-3)

实际上你应该知道有更简单的方法可以做到这一点。

您可以通过总和轻松表示乘法。

这意味着4 * 3 = 3 + 3 + 3 + 3

所以提醒一下,你可以建立这个:

values = ary.map{|h| h[13]}.compact