高质量的代码--持续更新

2019-07-29  本文已影响0人  枫叶忆

<h2 id="1">1. 代码质量</h2>

<h3 id="1.1">1.1 代码的规范性</h3>

清晰的书写

清晰的布局

合理的命名

<h3 id="1.2">1.2 代码的完整性</h3>

功能测试

边界测试

负面测试

<h4> 面试题16、数值的整数次方</h4>

初始解法:

double Power(double base, int exponent){
    double result = 1.0;
    for(int i = 1; i <= exponent; i++){
        result *= base;
    }
    return result;
}

以上代码考虑的并不完整,未考虑输入指数(exponent)小于1的情况。

全面但不高效的解法

分析:当指数为负数时,可以先对指数取绝对值,算出结果后再取倒数。还需要考虑底数为0,指数为负数的情况,针对这种错误,有3种处理办法:返回值、全局变量和异常。

bool g_InvalidInput = false;
double Power(double base, int exponent){
    g_InvalidInput = false;
    if(equal(base, 0.0) && exponent < 0){
        g_InvalidInput = true;
        return 0.0;
    }
    unsigned int absExponent = (unsigned int)exponent;
    if(exponent < 0){
        absExponent = (unsigned int)(-exponent);
    }
    
    double result = PowerWithUnsignedExponent(base, absExponent);
    if(exponent < 0){
        result = 1.0/result;
    }
    return result;
}

double PowerWithUnsignedExponent(double base, unsigned int exponent){
    double result = 1.0;
    for(int i = 0; i <= exponent; i++){
        result *= base;
    }
    return result;
}

上述代码采用全局变量来标识是否出错。但是代码需要调用者去检查全局变量以判断是否出错。

全面又高效的解法

分析:对次方进行拆解,使用递归实现

公式:

a^n=\left\{
\begin{aligned}
a^{n/2}*a^{n/2} \text{, n为偶数}\\ 
a^{(n-1)/2}*a^{(n-1)/2}  \text{, n为奇数}
\end{aligned}
\right.
double PowerWithUnsignedExponent(double base, unsigned int exponent){
    if(exponent == 0){
        return 1;
    }
    if(exponent == 1){
        return base;
    }
    
    double result = PowerWithUnsignedExponent(base, exponent>>1);
    result *= result;
    if(exponent & 0x1 == 1){
        result *= base;
    }
}

细节
用右移运算替代除以2,用位运算符替代求余来判断奇数偶数。提高了执行效率。

<h3 id="1.3">1.3 代码的鲁棒性</h3>

<h2 id="2">2. 结语</h2>

<h2 id="3">3. 参考文献</h2>

剑指offer

上一篇 下一篇

猜你喜欢

热点阅读