利用數學方法來大大降低乙個邏輯判斷實現的難度的例子

2021-04-12 17:09:14 字數 1634 閱讀 4406

這是我的畢業設計(乙個名叫viblogging的blog系統)中需要的乙個功能:在使用者註冊時根據輸入的密碼來顯示密碼強度(模仿passport的,不過是使用atlas)。

對於密碼強度,分為弱、中、強三等級,我的判斷規則是:

1。如果密碼的位數在3~4位之間,如果只含有字母,那麼強度為弱。

2。如果密碼的位數在3~4位之間,,如果還含有數字,那麼強度也為弱。

3。如果密碼的位數在3~4位之間,如果含有非字母數字的字元,那麼強度為中。

4。如果密碼位數在5~7之間,只含有字母的強度為弱

5。如果密碼位數在5~7之間,同時還有數字的強度為中。

6。如果密碼位數在5~7之間,同時還有非字母數字字元的強度為強。

7。如果密碼長度大於7,如果只含有字母,那麼強度為中。

8。如果密碼長度大於7,如果還含有數字的話強度為中。

9。如果密碼長度大於7,如果含有非字母數字字元的話,強度為強。

如果此時昨晚規則的分析後就著手寫**的話,那要寫一堆if巢狀了。這樣做的話,很可能會使得邏輯陷入混亂,很有可能一些情況就被忽略過去了。更為嚴重的是,這樣寫嚴重降低了**的可讀性。如果我必須用這樣的方式來寫,那我首先會去寫unit test,其次再附詳細的doc或注釋來說明。

okay,那我們進一步來分析一下。我們上述的9個條件都是由密碼長度密碼複雜度兩部分來結合判斷出來的。那麼我們可以拆分一下,如下圖所示(請大家先只看第乙個**):(我點"insert image from gallery"後顯示訪問的資源不存在,無法從這插入了,所以在首頁可能看不到有)

我們現在寫兩個函式,分別計算長度和複雜度對應的強度,並返回。這裡我們用和來表示(為什麼後者是在後面會講到)那麼我們可以很容易把上面的9個規則總結成第乙個**來表示。

到這裡為止,我可以分別使用i和j來表示拆分後的強度的表示,好,現在我們可以去寫清晰一點的if..else巢狀或if..switch巢狀了,這裡我們可以用識別符號了,採用了簡單的分而治之的思想,整個規則也被簡化為了7步了(讀者可以自己考慮一下),思路清晰了許多。

但是目前為止,我們還是沒有脫離巢狀條件分支語句的尷尬和不便

okay,我們繼續對這個邏輯的返回結果作分析:

強度:情況1,情況2 = § [(i+j)min,(i+j)max]

strong: f,i = § [4,5]

medium: g,e,h,c = § [2,3]

weak: a,b,d = § [0,1]

好,這樣結果就很清楚了,當返回的i+j在》3時,那麼強度肯定是strong的,如果小於2,那麼肯定是weak的,剩下的就是medium的了。這樣只要寫乙個switch就完成任務了(我只在有雙分支的時候用if,2個以上的都用switch,學過編譯原理的應該知道它比if效率高,可是.net中他倆有什麼效能區別我不知道,但是如果不出意外,應該還是比if效率高吧)。

此文僅在提供一種分解問題和歸類問題各部分結果的小方法,當然也有「運氣成分」(這就是為什麼用不用的原因)。拋磚引玉,希望能學到更好的解決辦法。

1 6 數學方法簡介

所謂方法,是指人們為了達到某種目的而採取的手段 途徑和行為方式中所包含的可操作的規則或模式.人們通過長期的實踐,發現了許多運用數學思想的手段 門路或程式.同一手段 門路或程式被重複運用了多次,並且都達到了預期的目的,就成為數學方法.數學方法是以數學為工具進行科學研究的方法,即用數學語言表達事物的狀態...

js數學方法應用

找出陣列中最大的數 var values 1,2,3,4,5,6,7,8 如果你想選擇乙個 1 到 10之間的數值,可以像下面這樣編寫 var num math.floor math.random 10 1 技巧就是math.random 生成數字的數量 生成的起始數字 比如,你要生成79 85的隨...

約瑟夫問題的數學方法

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達 o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是 要讀者模擬整個過程。因此如果要追求效率,就要打破...