递归:x的n次幂

50. Pow(x, n)

这个递归也非常有意思,同样是有点难以理解,我们求 x n x^n xn其实可以递归成两种情况
x n = { ( x n 2 ) 2 n%2==0 x ∗ ( x n 2 ) 2 n%2==1 x^n= \begin{cases} (x^{\frac{n}{2}})^2 & \text{n\%2==0} \\ x*(x^{\frac{n}{2}})^2 & \text{n\%2==1} \\ \end{cases} xn={(x2n)2x(x2n)2n%2==0n%2==1
转化成递归函数的形式就是
p o w ( x , n ) = { p o w ( x , n / / 2 ) 2 n%2==0 x ∗ p o w ( x , n / / 2 ) 2 n%2==1 pow(x,n)= \begin{cases} pow(x,n//2)^2& \text{n\%2==0} \\ x*pow(x,n//2)^2 & \text{n\%2==1} \\ \end{cases} pow(x,n)={pow(x,n//2)2xpow(x,n//2)2n%2==0n%2==1

你问我怎么求解 p o w ( x , n / / 2 ) pow(x,n//2) pow(x,n//2)我也不知道,反正就是根据这个递归公式不断递归就可以求解出来了。我也不知道怎么求 p o w ( x , n ) pow(x,n) pow(x,n),但是如果我求出了 p o w ( x , n / / 2 ) pow(x,n//2) pow(x,n//2)我就可以求出 p o w ( x , n ) pow(x,n) pow(x,n)了,如和求求解 p o w ( x , n / / 2 ) pow(x,n//2) pow(x,n//2)呢?我只要求解出 p o w ( x , n / / 4 ) pow(x,n//4) pow(x,n//4)就可以了,这样问题最后就会缩减到n=1也就是停止条件上,然后递归再进行返回,我们操作这个返回结果即可。

class Solution:
    def myPow(self, x: float, n: int) -> float:

        def dfs(x,n):
            if n == 0:
                return 1
            y = dfs(x, n//2)
            if n % 2 == 0:
                return y * y
            else:
                return x * y * y
        
        if n < 0:
            x = 1 / x
            n = -n

        r = dfs(x,n)
        return r

你可能感兴趣的:(leetcode,深度优先,leetcode,算法)