根据代码中使用的乘法运算,我很难理解以下递归算法。
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。我试图了解每个递归调用的乘法运算中的因素和乘积。
答案 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
没有减少,那么您将陷入无限循环。
因此,要回答您的问题,a
或b
都不会相乘,因为所有都在返回值中。仅减少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;