• leetcode 50. Pow(x, n)


     递归:

    class Solution {
    public:
        double myPow(double x, int n) {
            if(n==0) return 1;
            if(n<0)
                return 1/myPow(x,-n);
            if(n&1==0)
                return myPow(x*x,n/2);
            return x*myPow(x,n-1);
        }
    };

     迭代:

    class Solution {
    public:
        double myPow(double x, int n) {
            double res=1.0;
            int p=n;
            while(p){
                if(p&1==1)
                    res*=x;
                p/=2;if(p==0) break;
                x*=x;
            }
            return n>0?res:1/res;
        }
    };

    这道题目应该使用迭代方法,因为使用递归方法会出现stack overflow(并不是说递归的代码是错误的,事实上递归的代码大多数样例可以正确运行)

    正确的递归如下:

    /**
    递归法:O(logn)
    **/
    class Solution {
    public:
        double myPow(double x, int n) {
            if (n==0) return 1;
            double t = myPow(x,n/2);
            if (n%2) {
                return n<0 ? 1/x*t*t : x*t*t;
            } else {
                return t*t;
            }
        }
    };

  • 相关阅读:
    顾问和注解
    正则
    GitHub 的简单使用
    JavaScript变态题目
    常用的Javascript设计模式
    HTML5 本地裁剪上传图片
    webpack 打包
    详解js闭包
    常用的Javascript设计模式
    call appiy
  • 原文地址:https://www.cnblogs.com/joelwang/p/10664891.html
Copyright © 2020-2023  润新知