// Ex5_15.cpp (based on Ex5_01.cpp)
// A recursive version of x to the power n
#include <iostream>
using std::cout;
using std::endl;
double power(double x, int n); // Function prototype
int main(void)
{
double x(2.0); // Different x from that in function power
double result(0.0);
// Calculate x raised to powers -3 to +3 inclusive
for(int index = -3; index <= 3; index++)
cout << x << “ to the power “ << index << “ is “ << power(x, index) << endl;
return 0;
}
// Recursive function to compute integral powers of a double value
// First argument is value, second argument is power index
double power(double x, int n)
{
if(n < 0)
{
x = 1.0/x;
n = -n;
}
if(n > 0)
return x*power(x, n-1);
else
return 1.0;
}
我在学校上课编程。这是本书中给出的递归函数的一个例子。我不太清楚他们在做什么以及涉及的技术。我只是想知道是否有人可以向我解释这一点,或者至少指出我正确的方向,以便我能更好地理解这种技术。
答案 0 :(得分:2)
让我们来看看你致电power(2,3)
时会发生什么:
double power(double x, int n) { // x = 2, n=3;
if (n<0) {...} // false, so skip the brackets
if (n>0) // true
return x*power (x; n-1); // call power() again, with different paraleters
... // the rest is skipped
}
所以它返回2 * power(something)
。在能够计算返回值之前,power()
必须再次调用自己。这是一个递归调用。你可以看到这个就好像要执行的函数的另一个副本,它有自己的变量(即不触及调用实例的局部变量)。
所以现在使用参数x = 2和n = 2调用power()
。执行流程类似,它将返回2 * power(x, n-1)
但n-1
现在为1.所以这里再次递归。
现在调用power()
,x = 2且n = 1。这将返回2 * power(x, n-1)
,但是n-1现在为0.并且再次递归;
最后,将调用x = 2和n = 0的电源。这里执行流程将跳过两个ifs并最终将执行elese分支,因为n为0.它将返回1.
现在我们拥有所有元素,通过清理这些连续的调用来计算价值
所有这些都可以用图形方式显示:
power(2,3)
|
+--> 2 * power(2,2)
|
+--> 2* power(2,1)
|
+--> 2* power(2,0)
|
1
所以最后它返回2 * 2 * 2 * 1,这是2 ^ 3,这是预期的结果。
通过进一步推广此推理,您可以使用mathematical induction来证明对于任何n&gt; = 0,power (x, n)
将返回x^n
。我让你自己看看当n为负时会发生什么,让你完成练习。
这里有一些furhter reading可以帮助在不同的视角下进行一些图形解释。
答案 1 :(得分:1)
递归函数总是有两个部分:递归和底部。递归仅仅意味着根据相同问题的较小版本来计算结果。底部是最后一种情况,递归停止。在示例代码中,当n
为0时,底部出现,并且该情况的结果为1.0。当n
大于0时发生递归;它将x
乘以power(x, n-1)
的较小字母。由于每次递归将n
减少1,最终你会触及底部,得到1.0的结果,并返回执行乘法的调用链,直到你达到顶级调用,从而得到结果。正如Ed Heal在评论中所说,用铅笔和纸来试试。