通過(guò)Python3實(shí)現(xiàn)一些簡(jiǎn)單遞歸函數(shù)
大家好!今天我給大家演示一下通過(guò)Python3實(shí)現(xiàn)一些簡(jiǎn)單遞歸函數(shù)的過(guò)程。遞歸算法實(shí)際上就是分而治之思想的具體應(yīng)用。每當(dāng)你設(shè)計(jì)一個(gè)算法時(shí),只要發(fā)現(xiàn)算法的處理對(duì)象變化,但是處理過(guò)程(步驟)相同,則可以?xún)?yōu)
大家好!今天我給大家演示一下通過(guò)Python3實(shí)現(xiàn)一些簡(jiǎn)單遞歸函數(shù)的過(guò)程。遞歸算法實(shí)際上就是分而治之思想的具體應(yīng)用。每當(dāng)你設(shè)計(jì)一個(gè)算法時(shí),只要發(fā)現(xiàn)算法的處理對(duì)象變化,但是處理過(guò)程(步驟)相同,則可以?xún)?yōu)先考慮遞歸實(shí)現(xiàn),尤其是在處理的對(duì)象個(gè)數(shù)不確定時(shí)更需要采用遞歸算法。設(shè)計(jì)遞歸算法時(shí),只需要找到基線條件(函數(shù)返回的條件)和遞歸條件(繼續(xù)進(jìn)行遞歸調(diào)用的條件)即可開(kāi)始編寫(xiě)算法實(shí)現(xiàn),通常這兩個(gè)條件是互斥存在的。如果您覺(jué)得這篇教程有幫助,請(qǐng)為我投上寶貴的一票,謝謝!
創(chuàng)建Pure Python項(xiàng)目
啟動(dòng)PyCharm軟件,新建一個(gè)名為"AlgorithmDemo4"的Pure Python項(xiàng)目,然后向項(xiàng)目中添加一個(gè)名為""的Python文件。在文件中定義一個(gè)sum_num函數(shù),然后調(diào)用此函數(shù)輸出100以?xún)?nèi)的自然數(shù)之和。sum_num函數(shù)采用for循環(huán)實(shí)現(xiàn)從1到n之間的自然數(shù)累加,計(jì)算的最終結(jié)果會(huì)返回給函數(shù)調(diào)用者。測(cè)試代碼編寫(xiě)完畢后,調(diào)試運(yùn)行程序。在彈出的控制臺(tái)窗口中,可以見(jiàn)到程序的執(zhí)行結(jié)果,表示一切正常。
使用等差數(shù)列求和公式
關(guān)閉控制臺(tái)窗口,返回到文件中。繼續(xù)定義一個(gè)sum_num_formula函數(shù)及調(diào)用此函數(shù)計(jì)算100以?xún)?nèi)自然數(shù)的測(cè)試代碼。sum_num_formula函數(shù)根據(jù)等差數(shù)列求和公式實(shí)現(xiàn),具有極高的運(yùn)算效率。測(cè)試代碼編寫(xiě)完畢后,調(diào)試運(yùn)行程序。在彈出的控制臺(tái)窗口中,可以確定該函數(shù)的計(jì)算結(jié)果與sum_num函數(shù)相同,唯一區(qū)別是其返回值為浮點(diǎn)數(shù)。
遞歸方式計(jì)算自然數(shù)之和
關(guān)閉控制臺(tái)窗口返回文件中。這次在代碼中定義一個(gè)以遞歸方式計(jì)算N以?xún)?nèi)自然數(shù)和的函數(shù)sum_num_rec。實(shí)現(xiàn)該函數(shù)的實(shí)質(zhì),仍舊是累加求和,與for循環(huán)實(shí)現(xiàn)不同的是每次累加都是通過(guò)調(diào)用函數(shù)自身實(shí)現(xiàn)的,另外,遞歸是從n加到1,當(dāng)n等于0時(shí)即停止遞歸(即基線條件)。sum_num_rec函數(shù)及其測(cè)試代碼編寫(xiě)完畢后,調(diào)試運(yùn)行程序,在彈出的控制臺(tái)窗口中,可以見(jiàn)到與之前兩個(gè)函數(shù)一致的輸出結(jié)果,表示算法實(shí)現(xiàn)正確。
計(jì)算正整數(shù)階乘
關(guān)閉控制臺(tái)窗口返回到文件中,繼續(xù)定義一個(gè)采用遞歸方式計(jì)算正整數(shù)階乘的函數(shù)calc_factorial以及調(diào)用它計(jì)算0~10階乘的測(cè)試代碼。在實(shí)現(xiàn)calc_factorial函數(shù)時(shí),需要注意0的階乘是1,表示沒(méi)有東西組合,這也是一種組合結(jié)果。因此,該函數(shù)的基線條件為n等于0,遞歸條件則為n大于0,對(duì)于n小于0則當(dāng)做非法輸入,返回None(這里應(yīng)該拋異常)。
十進(jìn)制數(shù)轉(zhuǎn)二進(jìn)制數(shù)
計(jì)算階乘的測(cè)試代碼編寫(xiě)完畢后,調(diào)試運(yùn)行程序。在彈出的控制臺(tái)窗口中,可以見(jiàn)到輸出的0~10的階乘計(jì)算結(jié)果。
關(guān)閉控制臺(tái)窗口返回到文件中。最后,我給大家介紹一下根據(jù)短除法計(jì)算10進(jìn)制數(shù)轉(zhuǎn)2進(jìn)制數(shù)的遞歸函數(shù)實(shí)現(xiàn)過(guò)程。短除法實(shí)際上具有非常明顯的遞歸特性,其計(jì)算條件輸入數(shù)小于2,反之則是遞歸條件。對(duì)于10進(jìn)制轉(zhuǎn)2進(jìn)制而言,除了用短除法計(jì)算二進(jìn)制位的值,還需要最終將每一步得到的余數(shù)顛倒,才能得到正確的結(jié)果。因此,在實(shí)現(xiàn)d2b函數(shù)時(shí),將通過(guò)短除法計(jì)算二進(jìn)制位的過(guò)程放到short_div函數(shù)中,顛倒結(jié)果次序的處理則放到d2b函數(shù)中。當(dāng)函數(shù)編寫(xiě)完畢后,繼續(xù)添加調(diào)用d2b函數(shù)輸出0~32的二進(jìn)制數(shù)的測(cè)試代碼。
代碼編寫(xiě)完畢后,調(diào)試運(yùn)行程序,在彈出的控制臺(tái)窗口中,可以見(jiàn)到按自定義格式輸出的十進(jìn)制數(shù)轉(zhuǎn)二進(jìn)制數(shù)的結(jié)果。
至此,簡(jiǎn)單遞歸算法就介紹完畢了。希望你在設(shè)計(jì)算法時(shí),可以抓住分而治之思想的精髓(基線條件和遞歸條件),設(shè)計(jì)出高效的遞歸算法,Enjoy!