高品質のコード:継続的な更新
2218 ワード
1.コード品質
1.1コードの規範性
はっきりと書く
明確なレイアウト
合理的なネーミング
1.2コードの整合性
機能テスト
境界テスト
ネガティブテスト
面接問題16、数値の整数次
初期解法:
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で割り,ビット演算子で置換して余剰を求めて奇数偶数を判断する.実行効率が向上しました.
1.3コードのロバスト性
2.結語
3.参考文献
剣指offer