【问题标题】:Using recursive functions in C++在 C++ 中使用递归函数
【发布时间】:2016-01-07 06:34:04
【问题描述】:
// 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;
    }

我在学校学习编程课程。这是书中给出的递归函数的示例。我不太清楚他们在做什么以及所涉及的技术。我只是想知道是否有人可以向我解释这一点,或者至少为我指明正确的方向,以便我更好地理解这种技术。

【问题讨论】:

  • 为什么不用铅笔和一张纸,用xn的值写出幂的步骤,得到xn的新值得到了解正在发生的事情
  • 问问你的讲师/老师,他们会为你解释的。
  • 老师似乎没有直接解决手头的问题,我觉得这本书没有解释清楚。我从这个网站找到了更好的答案和理解。
  • 作为获得更多理解的另一种策略:使用您的调试器逐行单步执行代码(单步执行函数调用)。如果您不知道该怎么做:现在是学习如何使用调试器的好时机。提示:如果您的调试器支持它(例如 Visual Studio),也让它显示调用堆栈并注意它是如何变化的。
  • @jxh - “向我解释这段代码”问题与程序员无关。

标签: c++ function recursion


【解决方案1】:

让我们看看当你调用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() 必须再次调用自身。这是一个递归调用。您可以将其视为将要执行的函数的另一个副本,具有自己的变量(即不触及调用实例的局部变量)。

  • 所以现在power() 使用参数x=2 和n=2 调用。执行流程类似,它将返回 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 调用 power。这里的执行流程将跳过两个 if,最终执行 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>=0,power (x, n) 将返回x^n。我让你通过观察当 n 为负数时会发生什么来完成这个练习。

这里有一些furhter reading 可以帮助在不同视角下进行一些图形解释。

【讨论】:

    【解决方案2】:

    递归函数总是有两个部分:递归和底部。递归只是意味着根据同一问题的较小版本来计算结果。底部是最后一种情况,递归停止。在示例代码中,当n 为 0 时出现底部,该情况的结果为 1.0。当n大于0时发生递归;它将x 乘以较小的power(x, n-1)。由于每次递归都会将n 减 1,因此最终您会到达底部,得到 1.0 的结果,然后返回执行乘法的调用链,直到您遇到顶级调用,这会给出结果。正如 Ed Heal 在他的评论中建议的那样,用铅笔和纸试试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      相关资源
      最近更新 更多