摘 要:遞歸算法通過直接或間接調(diào)用自身算法來進(jìn)行運(yùn)算,在程序開發(fā)中用于解決大類問題非常有效,能使描述更為簡(jiǎn)單易懂,不過存在運(yùn)行效率較低問題。本文在分析遞歸算法與迭代算法優(yōu)缺點(diǎn)的基礎(chǔ)上,就遞歸算法在管理系統(tǒng)權(quán)限模塊中的應(yīng)用進(jìn)行了淺要的探討,有一定的借鑒參考價(jià)值。
關(guān)鍵詞:遞歸算法;管理系統(tǒng);權(quán)限模塊;實(shí)際應(yīng)用
中圖分類號(hào):TP311.1
在軟件開發(fā)中,需要先對(duì)軟件所需實(shí)現(xiàn)的功能進(jìn)行分析,在設(shè)計(jì)出相適應(yīng)的算法后再編寫程序,最后使軟件能實(shí)現(xiàn)相應(yīng)的功能。常用的算法有解析法、窮舉法、排序查找法、遞歸算法、迭代算法等,不同的算法有著各自的優(yōu)缺點(diǎn),在解決實(shí)際問題時(shí)有不同的適應(yīng)性。權(quán)限管理系統(tǒng)是通過設(shè)置安全規(guī)則或安全策略,來對(duì)用戶的訪問進(jìn)行授權(quán)的系統(tǒng),幾乎在任何系統(tǒng)里面都有權(quán)限管理系統(tǒng)模塊存在。具體采用什么算法來進(jìn)行權(quán)限管理系統(tǒng)的設(shè)計(jì),以提高權(quán)限管理系統(tǒng)的安全性和運(yùn)算效率,并提高權(quán)限管理系統(tǒng)的靈活性,一直是軟件開發(fā)需要重點(diǎn)考慮的一個(gè)問題。下面,本文就遞歸算法在權(quán)限管理系統(tǒng)中的應(yīng)用進(jìn)行淺要的探討。
1 遞歸算法的適應(yīng)性分析
1.1 遞歸算法的定義
遞歸算法是將問題轉(zhuǎn)化為規(guī)模較小的同類問題的子問題,再用遞歸調(diào)用函數(shù)或過程來表示問題的解的一種算法。這種算法利用函數(shù)或子過程,在函數(shù)或子過程內(nèi)部間接或直接調(diào)用自己本身,在編寫程序時(shí)能使程序變得更為簡(jiǎn)潔和清晰。遞歸的本義實(shí)質(zhì)是將未知的歸結(jié)為已知的,因此在應(yīng)用遞歸算法時(shí),遞歸函數(shù)的定義域的值都采用自然數(shù),而對(duì)未知數(shù)值的計(jì)算則通過回歸到已知數(shù)值來進(jìn)行計(jì)算,從而形成一種循環(huán)結(jié)構(gòu),將較復(fù)雜的問題遞次歸結(jié)為較簡(jiǎn)單的問題進(jìn)行計(jì)算,直至解決問題為止。在實(shí)際應(yīng)用中,遞歸算法又有直接遞歸和間接遞歸兩種。直接遞歸是在定義一個(gè)過程或函數(shù)時(shí)存在調(diào)用本過程或函數(shù)的成分,也就是調(diào)用自己本身。間接遞歸是在調(diào)用過程或函數(shù)過程中,先通過調(diào)用別的過程或函數(shù),被調(diào)用的這個(gè)過程或函數(shù)則調(diào)用該過程或函數(shù),即A調(diào)用B,而B又調(diào)用A的間接調(diào)用方式。運(yùn)用遞歸算法,回歸重復(fù)往往需要滿足一些基本要求,即每次調(diào)用在規(guī)模上都需要有所縮小,相鄰兩次重復(fù)之間前一次重復(fù)往往是為后一次做準(zhǔn)備,當(dāng)問題規(guī)模極小時(shí)則直接給出解答,避免再進(jìn)行遞歸調(diào)用,以免因無條件遞歸調(diào)用而成為死循環(huán)導(dǎo)致計(jì)算無法正常結(jié)束。遞歸算法的偽代碼可以簡(jiǎn)化為:
{
If 滿足基本條件
Return基本結(jié)果
Else
Return調(diào)用遞歸函數(shù)運(yùn)算結(jié)果
}
1.2 遞歸算法的適用領(lǐng)域
在軟件開發(fā)和分析中,遞歸算法是一種極為有用的算法。在軟件開發(fā)中,運(yùn)用遞歸算法能使函數(shù)定義和算法的描述更為簡(jiǎn)潔且易于理解,尤其是一些數(shù)據(jù)結(jié)構(gòu)如二叉樹等,其本身就有明顯的遞歸特性,運(yùn)用遞歸形式來進(jìn)行描述具有極高的適應(yīng)性。既便是一些本身沒有明顯遞歸特性的問題,采用遞歸算法來進(jìn)行運(yùn)算,也會(huì)使程序更為簡(jiǎn)潔易懂,利于分析和設(shè)計(jì)??傮w來講,遞歸算法具有結(jié)構(gòu)清晰,可讀性強(qiáng),容易利用數(shù)學(xué)歸納法來驗(yàn)證算法正確性的優(yōu)點(diǎn),用來設(shè)計(jì)算法、調(diào)試程序極為簡(jiǎn)便。不過由于運(yùn)用遞歸算法會(huì)存在大量多余的計(jì)算,并多次調(diào)用之前已經(jīng)調(diào)用過的計(jì)算結(jié)果,會(huì)使每一次遞歸的計(jì)算量越來越多,當(dāng)存在大量遞歸運(yùn)算時(shí),將會(huì)使得運(yùn)算效率大為下降。同時(shí),運(yùn)用遞歸算法時(shí),還要求問題具有可分性和解具有可歸并的特性。因此,遞歸算法多適用于遞歸次數(shù)較少,同時(shí)具有可分性和解具有可歸并特性的問題中。如果當(dāng)問題不滿足這些條件,此時(shí)不應(yīng)單獨(dú)采用遞歸調(diào)用來處理問題,以免使問題的處理過程反而變得更為復(fù)雜。
2 迭代算法的適應(yīng)性分析
2.1 迭代算法的定義
迭代算法也是一種計(jì)算機(jī)解決問題的基本方法。迭代算法通過不斷用變量的舊值來遞推新值,即讓計(jì)算機(jī)對(duì)一組指令或步驟重復(fù)執(zhí)行,每次執(zhí)行這組指令或步驟時(shí),都從變量原值推出它的一個(gè)新值,最終完成問題的處理。是一種從初始估計(jì)值出發(fā)尋找一系列近似解來解決問題的方法。如牛頓法、最速下降法、最小二乘法、線性規(guī)劃、共軛迭代法等,都是常用的迭代算法。如對(duì)于給定的線性方程組a=Ba+D,其中a、B、D都是矩陣,任意線性方程均可以變換為這種形式,用公式a(k+1)=Ba(k)+f,代表迭代k次得到a,初始時(shí)k=0,從而通過逐步帶入求近似解,最后完成運(yùn)算。
2.2 迭代算法的適用領(lǐng)域
在運(yùn)用迭代算法時(shí),其整個(gè)運(yùn)算過程是不斷對(duì)一組指令或步驟重復(fù)執(zhí)行,從變量的原值推出其新值最后解決問題。因此,在運(yùn)用迭代算法處理問題時(shí),首先要確定迭代變量,即需要處理的問題,至少有一個(gè)間接或間接的不斷由舊值遞推出新值的變量;其次需要建立迭代關(guān)系式,即建立起一個(gè)如何從變量前一個(gè)值推出下一個(gè)值的關(guān)系式,這個(gè)關(guān)系式是處理迭代問題的關(guān)鍵;此外,還需要對(duì)迭代過程進(jìn)行控制,充分考慮什么時(shí)候結(jié)束迭代過程,避免迭代過程無休止的進(jìn)入重復(fù)運(yùn)算之中,當(dāng)所需的迭代數(shù)是個(gè)確定值時(shí),可以利用一個(gè)固定次數(shù)的循環(huán)來實(shí)現(xiàn)迭代過程的控制,當(dāng)所需的迭代次數(shù)無法確定時(shí)則需要進(jìn)一步分析迭代次數(shù)以確定結(jié)束迭代過程的條件。由于迭代算法的這些約束條件,如果在設(shè)計(jì)算法時(shí)對(duì)結(jié)束迭代的控制未充分考慮,極容易使整個(gè)運(yùn)算陷入死循環(huán)中,同時(shí)對(duì)于結(jié)構(gòu)復(fù)雜的問題,當(dāng)?shù)螖?shù)極為龐大甚至出現(xiàn)多個(gè)問題的累加時(shí),將會(huì)使整個(gè)運(yùn)算極為耗費(fèi)時(shí)間。
3 遞歸算法在管理系統(tǒng)權(quán)限模塊中的實(shí)際應(yīng)用
3.1 管理系統(tǒng)權(quán)限模塊開發(fā)需求
在很多軟件中,都存在權(quán)限管理系統(tǒng)模塊,用以設(shè)置系統(tǒng)的安全規(guī)則或構(gòu)建系統(tǒng)安全策略,使用戶可以訪問并只能訪問到被授權(quán)的資源,其運(yùn)作基本原理即給用戶分配角色,賦予相應(yīng)的權(quán)限,如最常見的基于角色的訪問控制管理。權(quán)限管理系統(tǒng)模塊并不是指用戶身份認(rèn)證模塊、密碼加密模塊、系統(tǒng)管理模塊,而是對(duì)系統(tǒng)功能權(quán)限和數(shù)據(jù)權(quán)限的管理。在功能權(quán)限管理實(shí)現(xiàn)方面,通常需要進(jìn)行權(quán)限設(shè)置、權(quán)限驗(yàn)證,如運(yùn)用RBAC技術(shù)進(jìn)行角色訪問控制,在WEB系統(tǒng)中運(yùn)用Filter來完成權(quán)限驗(yàn)證等。數(shù)據(jù)權(quán)限管理中,如利用if/else等形式與業(yè)務(wù)代碼耦合形成硬編碼進(jìn)行邏輯控制,或者使用規(guī)則引擎進(jìn)行邏輯控制等。權(quán)限管理系統(tǒng)模塊必須注意避免URL侵入、SQL注入等系統(tǒng)漏洞,以提高權(quán)限管理的設(shè)置與解析安全能力。
3.2 管理系統(tǒng)權(quán)限模塊應(yīng)用遞歸算法的優(yōu)點(diǎn)
在權(quán)限管理系統(tǒng)中,不論是采用角色授權(quán)還是直接授權(quán)的方式,權(quán)限管理模塊需要對(duì)用戶的權(quán)限進(jìn)行獲取和驗(yàn)證。其中,角色授權(quán)通過授予特定角色某一特定的權(quán)限,使用戶能享有相應(yīng)的權(quán)限,直接授權(quán)則對(duì)用戶直接授予具體的功能權(quán)限。在系統(tǒng)權(quán)限管理中,權(quán)限的授予往往根據(jù)職能分配,考慮到隨著職能變化和分工的細(xì)化需求,系統(tǒng)權(quán)限管理需要有極強(qiáng)的靈活性和實(shí)用性。以實(shí)現(xiàn)用戶權(quán)限的動(dòng)態(tài)配置。因此,采用分級(jí)授權(quán)的模式進(jìn)行權(quán)限管理,具有更高的適用性,即當(dāng)前用戶所授權(quán)用戶的權(quán)限,不會(huì)大于自身權(quán)限,通過不同用戶的不同授權(quán)方式,將權(quán)限數(shù)據(jù)保存于不同的數(shù)據(jù)表中。在這種權(quán)限體系下,用戶進(jìn)入系統(tǒng)或使用某些功能時(shí),權(quán)限管理系統(tǒng)首先判斷該用戶是否屬于某一角色,如果角色非空則對(duì)角色權(quán)限進(jìn)行查詢,如果角色為空則查詢用戶權(quán)限表,根據(jù)用戶權(quán)限來對(duì)應(yīng)用系統(tǒng)相關(guān)功能進(jìn)行設(shè)置,以實(shí)現(xiàn)不同用戶在同一系統(tǒng)下的權(quán)限控制,甚至使不同權(quán)限的用戶進(jìn)入不同的操作界面。如果采用迭代算法,當(dāng)系統(tǒng)權(quán)限復(fù)雜角色較多的情況下,整個(gè)運(yùn)算過程將極為復(fù)雜,且系統(tǒng)權(quán)限變化的靈活性和控制性不強(qiáng)。如果采用遞歸算法,通過函數(shù)自身的調(diào)用來實(shí)現(xiàn)權(quán)限控制,能使代碼簡(jiǎn)單,且系統(tǒng)權(quán)限擴(kuò)充的靈活性強(qiáng),更能適應(yīng)權(quán)限管理系統(tǒng)模塊的需要。
3.3 遞歸算法在管理系統(tǒng)權(quán)限模塊中的應(yīng)用實(shí)例
以下是一則運(yùn)用遞歸算法在管理系統(tǒng)權(quán)限模塊中的應(yīng)用代碼,編程環(huán)境為VS2005+SQL2005+iis6.0。代碼如下:
public void AddTree(string vPFunID, TreeNode pNode)
{
DataView dvFunction=new DataView(dsfunction.Tables[\"Function\"]);
dvFunction.RowFilter=\"vPFunID='\"+vPFunID+\"'\";
foreach (DataRowView Row in dvFunction)
{
TreeNode tnfunction = new TreeNode();
tnfunction.Text = Row[\"vFunName\"].ToString();
tnfunction.Value = Row[\"iFunctionID\"].ToString();
tnfunction.SelectAction = TreeNodeSelectAction.Expand;
if (function.IsHaveRight(function) > 0)
{
tnfunction.Checked = true;
}
if (pNode == 1)
{
tvFunctions.Nodes.Add(tnfunction);
}
else
{
pNode.ChildNodes.Add(tnfunction);
}
AddTree(Row[\"vFunID\"].ToString(), tnfunction);
}
}
參考文獻(xiàn):
[1]吳川,江海寧.遞歸算法在程序設(shè)計(jì)中的應(yīng)用分析[J].科技資訊,2010(11).
[2]戴建國(guó),曹傳東.遞歸算法應(yīng)用分析[J].電腦知識(shí)與技術(shù),2008(10).
[3]仇閩霞.程序設(shè)計(jì)中的遞歸算法分析[J].福建電腦,2008(12).
[4]張素霞.基于數(shù)據(jù)結(jié)構(gòu)的程序遞歸算法設(shè)計(jì)[J].硅谷,2012(06).
作者簡(jiǎn)介:鄒曉燕(1985.10-),煙臺(tái)人,畢業(yè)于山東大學(xué),碩士研究生,工程師,研究方向:計(jì)算機(jī)應(yīng)用。
作者單位:山東中煙濟(jì)南卷煙廠,濟(jì)南 250014