【问题标题】:Recursive power function in C++C++中的递归幂函数
【发布时间】:2020-11-23 04:42:56
【问题描述】:

我在使用此功能时遇到了一些问题。该函数采用 a 并递归地计算它的 b 次方。当我编译它时,我的编译器给了我一个分段错误,我不确定如何修复。有人可以帮忙吗?

/****   Recursive power function   > Computes a^b, where b can be positive or negative*****/
        int recPower(double a, int b)
        {   
            if (b == 0)
            {
                return 1;
            }
            else
            {
                return (a *recPower(a, b-1));
            }
          }

/* Computes a^b (power function) */    
cout << "POWER" << endl;    
cout << "----------" << endl;    
int a = 2, b = -3;    
cout << a << "^" << b << " = ";    
cout << recPower(a, b) << endl;    
cout << endl;    

【问题讨论】:

  • return (a *recPower(a, b-1));b 为负数时,这将不起作用。在纸上试一试,看看为什么。
  • 如果您在尝试编译时遇到分段错误,则表明存在编译器错误。也许您的意思是当您尝试运行已编译的程序时遇到分段错误?

标签: c++ recursion


【解决方案1】:

崩溃是无限递归的结果。 b 永远不会达到 0,因为您在每个递归步骤中都将其递减。

您可能需要将此子句插入到您的代码中:

if (b < 0)
{
    return 1.0 / recPower(a,-b);
} 
else if (b == 0)
...

当然,a 的负数次方更肯定是 0 到 1 之间的值,如果返回类型是 int,则很难准确反映。这是一个留给你调和的练习。如果输入参数是双精度类型,recPower 应该可能返回双精度类型。

【讨论】:

    【解决方案2】:

    正如 divx 评论的那样,问题在于您的函数不适用于负指数:它进入了无限递归(不完全是无限的,但会导致堆栈溢出)。

    另外,如果基数是 double 或者你想处理负指数,那么函数应该返回一个 double

    这将完成工作:

    double recPower(double a, int b)
    {
        if (b < 0)
        {
            return 1.0/recPower(a, -b);
        }
        else if (b == 0)
        {
            return 1;
        }
        return (a *recPower(a, b-1));
    }
    

    您的示例的输出:

    POWER
    ----------
    2^-3 = 0.125
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      • 2015-08-05
      相关资源
      最近更新 更多