python多分支结构实例_JS优化多分支结构(经典)
多分支結構的優化有很多好處:既方便代碼維護,又可以提升代碼執行效率。例如,設計有多個條件,只有當多個條件都成立時,才允許執行特定任務。
示例1
遵循簡單的設計思路,使用多重分支逐個檢測這些條件。
if (a) {
if (b) {
if (c) {
if (d) {console.log("所有條件都成立!"); }
else {console.log("條件 d 不成立!"); }
} else {console.log("條件 c 不成立!"); }
} else {console.log("條件 b 不成立!"); }
} else {console.log("條件 a 不成立!"); }
示例2
上述設計沒有錯誤,結構嵌套合法。不過可以使用邏輯運算符進行優化。
if (a && b && c && d) {console.log("所有條件都成立!"); }
比較而言,使用?if?語句逐個檢測每個條件的合法性,并對某個條件是否成立進行個性化處理,以方便跟蹤。但是使用?if (a && b && c && d)?條件表達式,就沒法進行過程跟蹤。例如,如果?a?條件不成立,則程序會自動退出整個流程,而不管?b、c?和?d?的條件是否成立。這會使代碼跟蹤變得很困難。
示例3
優化設計思路,采用排除法,對每個條件逐一進行排除,如果全部成立則再執行特定任務。在排除過程中,使用一個標志變量把每一次條件檢測聯系在一起,最后根據這個標志變量決定是否完成特定任務。
var t = true; //初始化標志變量為true
if (! a) {
console.log("條件 a 不成立!");
t = false; //如果條件a不成立則標志變量為false
}
if (! b) {
console.log("條件 b 不成立!");
t = false; //如果條件a不成立則標志變量為false
}
if (! c) {
console.log("條件 c 不成立!");
t = false //如果條件a不成立則標志變量為false
}
if (! d) {
console.log("條件 d 不成立!");
t = false; //如果條件a不成立則標志變量為false
}
if (t) { //如果標志變量為true,則執行特定任務
console.log("所有條件都成立!");
}
排除法有效避免了條件嵌套的復雜性,不過這種設計也存在一定的局限性,例如,一旦發生錯誤,后面的操作將被放棄。為此還可以再設計一個標志變量來跟蹤錯誤。
數據映射
在多分支檢測中,表達式的重復運算會影響性能。如果檢測的條件滿足下面兩條,可以考慮使用數據映射來快速匹配,這樣有助于代碼的可讀性,大大提高了代碼的響應速度。
條件體的數量龐大
測試的條件值呈現離散狀態
實現方法:通過數組或普通對象實現。
示例1
在下面代碼中,使用?switch?多分支檢測離散值。
function map(value) {
switch (value) {
case 0 : return "result0";
case 1 : return "result1";
case 2 : return "result2";
case 3 : return "result3";
case 4 : return "result4";
case 5 : return "result5";
case 6 : return "result6";
case 7 : return "result7";
case 8 : return "result8";
case 9 : return "result9";
default : return "result10"
}
}
示例2
針對示例 1?可以使用數組查詢替代?switch?語句。下面代碼把所有離散值存儲到一個數組中,然后通過數組下標快速檢測元素的值。
function map(value) {
var results = ["result0","result1","result2","result3","result4","result5",
"result6","result7","result8","result9","result10"]
return results[value];
}
使用數據映射法可以消除所有條件判斷,但由于沒有條件判斷,當候選值數量增加時,基本不會增加額外的性能開銷。
如果每個鍵映射的不是簡單的值,而是一系列的動作,則使用?switch? 更適合。當然,也可以把這些動作包裝在函數中,再把函數作為一個值與鍵進行映射。
示例3
如果條件查詢中鍵名不是有序數字,則無法與數組下標映射,這時可以使用對象數據映射法。
function map(value) {
var results = {
"a" : "result0","b" : "result1","c" : "result2","d" : "result3","e" : "result4","f" : "result5",
"g" : "result6","h" : "result7","i" : "result8","j" : "resukt9","k" : "result10"
}
return results[value];
}
調整分支順序
在多分支結構中,各種條件存在先后、輕重的順序。如果把最可能的條件放在前面,把最不可能的條件放在后面,那么程序被執行時總會按照代碼先后順序檢測所有條件,直到發現匹配的條件時才停止。如果把最可能的條件放在前面,就等于降低了程序的檢測次數,自然也就提升了分支結構的執行效率,避免空轉。這在大批量數據檢測中效果非常明顯。
示例1
對于一個論壇系統來說,普通會員的數量要遠遠大于版主和管理員的數量。大部分登錄的用戶都是普通會員,如果把普通會員的檢測放在分支結構的前面,就會減少每次檢測的次數。
switch (level) { //優化分支順序
case 1 :
console.log("普通會員");
break;
case 2 :
console.log("版主");
break;
case 3 :
console.log("管理員");
break;
default :
console.log("請登錄");
}
在性能影響不大的情況下,遵循條件檢測的自然順序會更易于理解。
示例2
設計檢測周一到周五值日任務安排的分支結構。可能周五的任務比較重要,或者周一的任務比較輕,但是對于這類有著明顯順序的結構,遵循自然順序比較好。打亂順序,把周五的任務安排在前面,對于整個分支結構的執行性能沒有太大幫助,打亂的順序不方便閱讀。因此,按自然順序來安排結構會更富有可讀性。
switch (day) {
case 1 :
console.log("周一任務安排");
break;
case 2 :
console.log("周二任務安排");
break;
case 3 :
console.log("周三任務安排");
break;
case 4 :
console.log("周四任務安排");
break;
case 5 :
console.log("周五任務安排");
break;
default :
console.log("異常處理");
}
分支之間的順序應注意優化,當然,對于同一個表達式內部也應該考慮邏輯順序問題。由于邏輯與或邏輯或運算時,有可能會省略右側表達式的計算,如果希望右側表達式不管條件是否成立都被計算,就應該考慮邏輯順序問題。
示例3
有兩個條件?a?和?b,其中條件?a?多為真,而?b?是一個必須執行的表達式,那么下面邏輯順序的設計就欠妥當。
if (a && b) {
//執行任務
}
如果條件?a?為?false,則 JavaScript?會忽略表達式?b?的計算。如果?b?表達式影響到后面的運算,則不執行表達式?b,自然會對后面的邏輯產生影響。因此,可以采用下面的設計思路,在?if?結構前先執行表達式?b,這樣即使條件?a?的返回值為?false,也能夠保證?b?表達式被計算。
var c = b;
if (a && b) {
//執行任務
}
總結
以上是生活随笔為你收集整理的python多分支结构实例_JS优化多分支结构(经典)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencl 加速 c语言程序_Win1
- 下一篇: python tkinter布局混用_[