a对b的功效-递归算法

时间:2019-02-01 15:06:16

标签: algorithm recursion

根据代码中使用的乘法运算,我很难理解以下递归算法。

int power(int a, int b) {
    if (b < 0) {
        return 0;
    } else if (b == 0) {
        return 1;
    } else {           
        return a * power(a, b - 1);
    }
}

对于输入(3,7),结果将为2187。总共进行了6次递归调用:

Initial values - 3,7
First recursive call(3,6)
Second recursive call(3,5)
Third recursive call(3,4)
Fourth recursive call(3,3)
Fifth recursive call(3,2)
Sixth recursive call(3,1)

给出以下公式:

a * power(a, b - 1)

每个递归调用是否都将a和b的值相乘?这没有意义,因为最后会返回81。我试图了解每个递归调用的乘法运算中的因素和乘积。

6 个答案:

答案 0 :(得分:14)

您必须记住,a在每一步都与递归函数调用的结果相乘。您可能会这样看:

power(3,7)
= 3 * power(3,6)
= 3 * 3 * power(3,5)
= 3 * 3 * 3 * power(3,4)
= 3 * 3 * 3 * 3 * power(3,3)
= 3 * 3 * 3 * 3 * 3 * power(3,2)
= 3 * 3 * 3 * 3 * 3 * 3 * power(3,1)
= 3 * 3 * 3 * 3 * 3 * 3 * 3 * power(3,0)
= 3 * 3 * 3 * 3 * 3 * 3 * 3 * 1 // by definition when b = 0

在每个步骤中,根据函数定义,我们用power(a,b)替换对a * power(a,b-1)的调用,直到到达power(3,0)。这是否有助于清除正在发生的情况?

答案 1 :(得分:2)

 return a * power(a, b - 1);

此行有很多信息要传达。实际上,a是基础,b是力量,将提高为a。现在,每次我们将a与返回值相乘时,实际上是将其提高到一定的幂。
首次执行return语句时,它存储a的乘积和对power函数的调用。在随后的幂函数调用期间,b的值每次减小1。
因此,最终,当递归展开时,您将得到如下内容:

return a*a*a*a*a*a*a*1

最后,计算结果并将其发送回main方法。 (调用方法)

答案 2 :(得分:2)

您的函数int power(int a, int b)返回一个int。 因此,每次调用return a * power(a, b - 1);时,a都将乘以power(a, b - 1)返回的值,直到得到b == 0并返回1。

最后,您得到:

return (3 * (3 * (3 * (3 * (3 * (3 * (3 * 1)))))));

b的值是停止递归并获得结果的值。如果b没有减少,那么您将陷入无限循环。

因此,要回答您的问题,ab都不会相乘,因为所有都在返回值中。仅减少b即可达到预期的循环次数。

希望这对您有所帮助。

答案 3 :(得分:0)

实际上,这里发生的情况是,每次调用都是使用新的变量值进行的,例如,最后一次调用(3 * power(3,0))将返回3,因为(3 * 1)= 3,最后一次调用首先返回“ 1”,然后返回轨迹,最后一次调用b = 0,因此返回1乘以3,即变为3

对于其余通话,每次只需将这3相乘,

第五次呼叫,

它将返回值3 * 3

第四次它将返回,

3 * 9 ,, 等等

答案 4 :(得分:0)

  

每个递归调用是否都将a和b的值相乘?哪个不会   有道理

这是错误的假设。每个递归调用都将&的值相乘(用&&b-1执行相同功能的结果)。

答案 5 :(得分:0)

在这种情况下,您在上一次递归调用(a = 3, b = 0)上

} else if (b == 0) {
    return 1;

这意味着,位于行a = 3, b = 1上的前一个调用方(return a * power(a, b - 1);)可以替换为值return 3 * power(3, 1 - 1);-> return 3 * 1; // 1 being the last recursive call return value

采用上一个(a = 3, b = 2)并执行相同的操作

return a * power(a, b - 1);

->

return 3 * power(3, 2 - 1);

->

return 3 * 3 * 1; //the result of the a = 3, b = 1 call

依此类推...

a = 3,b = 3

return 3 * 3 * 3 * 1;

a = 3,b = 4

return 3 * 3 * 3 * 3 * 1;

a = 3,b = 5

return 3 * 3 * 3 * 3 * 3 * 1;

a = 3,b = 6

return 3 * 3 * 3 * 3 * 3 * 3 * 1;

a = 3,b = 7

return 3 * 3 * 3 * 3 * 3 * 3 * 3 * 1;