2015-09-22 132 views
3

我对编程相当陌生,并试图想出递归计算x^-n的方法。 (数学和计算递归的x^N之间的差后面的解释,将不胜感激):递归计算x^-n

double power(double x, int n) 
{ 
    if (n == 0) 
     return 1.0; 

    return x * power(x, n - 1) 
} 
+4

只是用x^-N =(1/X)^ n的 –

+2

只要记住'的x ^( - N)= 1 /(X^N)'' – Barranka

+1

x^-n'可以重写为'1 /(x)^ n',它可以与你现有的函数一起工作。 –

回答

2

X -n在数学上等于1/X ñ,所以你能适应X ñ的经典递归运算处理它太:

double power (double x, int n) { 
    if (n < 0) { 
     return 1.0/power(x, -1 * n); 
    } 
    if (n == 0) { 
     return 1.0; 
    } 
    return x * power (x, n - 1); 
} 
+0

这样的算法有一个通过每次递归调用的归约比较。有可能使用包装函数来检查n的符号,然后调用递归辅助函数。 –

+2

@OrestHera或者把最常见的情况'if(n> 0)...'作为第一个比较。 – pjs

+0

为什么选择'-1 * n'而不是'-n'? – pjs

1

x^-n相当于1/(x^n)。只要有像double result = 1.0/power(x,n);的声明,您的调用方法

0

X^-n实际上是1 /(X^N)

所以,你的函数可以改写为

double power_1(double x, unsigned int n) 
{ 
    if (n == 0) 
     return 1.0; 

    return power_1(x, n - 1)/x; 
} 

注意你的算法不是尾递归。对于tail call optimization它是有用的写类似的东西:

double power_1(double x, unsigned int n, double res = 1.0) 
{ 
    if (n == 0) 
     return res; 

    return power_1(x, n - 1, res/x); 
} 

最后res参数是结果的累加器。外部使用应该是1.0。结果作为函数参数通过所有递归调用传输。在缺省函数论证不支持的C中,它可以被称为power_1(x, n, 1.0)或在C++中被称为power_1(x, n)

0

该过程相当简单。我已经在VB.NET中编写了它,因为它就像英文一样,有点容易理解。

Function I(ByVal x As Double, ByVal n As Integer) As Double 
    If n = 0 Then 
     Return 1 
    End If 
    Return 1/x * I(x, n - 1) 
End Function 

每当在递归中编写函数时,都必须标识基本情况。例如,这个问题可以分解成什么?

在这里,基本情况是对于n = 0,这是简单地1.

然后就是反复步骤,将构建问题出这些基地步骤。

0

这基本上状态越来越未知数直到它到达n == 0的情况。一旦到达那里,它返回1,这意味着它可以找出n == 1的情况应该返回什么。你可以认为它等待返回它的x * power(x,n-1),直到x * power(x,n-1)行中的一个返回某些事件,这发生在n == 0时。从那里它可以找出x == 1的情况,依此类推,直到最终得出最终答案并返回到主代码。

这里从3显卡:

什么是对于x = 3的情况下? - 需要得到x = 2时为

ok, what's the case for x=2? 
    -need to get x=1 for that 

     ok, what's the case for x=1? 
      -need to get x=0 for that 

      ok, what's the case for x=0? 
       -the answer is one1 

     ok, then my answer is a bunch of stuff using case x=0's answer (1) 

    ok, then my answer is a bunch of stuff using case x=1's answer which uses x=0's answer (1) 

    ok, then my answer is a bunch of stuff using case=2's answer which uses x=1's answer, which uses x=1's answer (1) 
-1

正如大家所说,的x^-n是等于1/X^N。因此,这可能是一个答案:

function power(double x, int n) { 
    if (n == 0) 
     return 1.0; 

    return 1/ x*power(x, n + 1) 
}