所謂基例就是不需要遞歸就能求解的,一般來說是問題的最小規(guī)模下的解。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、小程序定制開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了洞口免費建站歡迎大家使用!
例如:斐波那契數(shù)列遞歸,f(n) = f(n-1) + f(n-2),基例是1和2,f(1)和f(2)結(jié)果都是1
再比如:漢諾塔遞歸,基例就是1個盤子的情況,只需移動一次,無需遞歸
遞歸必須有基例,否則就是無法退出的遞歸,不能求解。
簡單說,解決以上問題的思路是,循環(huán)執(zhí)行n*n-1,直到n=1時。
#!/usr/local/bin/python3.3def recursion(n): #定義函數(shù) if n == 1: return 1 else:
return n * recursion(n-1)print(recursion(10))
該示例執(zhí)行結(jié)果是:
如何理解呢?第一點,函數(shù)中,調(diào)用自身函數(shù)的那部分句子,即return n *
recursion(n-1),把recursion(n-1)想像成另一個獨立的函數(shù),該函數(shù)的功能返回n-1的值,如果n的值是1,則返回1,函數(shù)運行結(jié)束。第二點,直觀的看,可以把return
n * recursion(n-1)看成return n*(n-1)*(n-2)...1。而遞歸函數(shù)無非是在指定的條件下做普通的循環(huán)而已。
遞歸的思想主要是能夠重復(fù)某些動作,比如簡單的階乘,次方,回溯中的八皇后,數(shù)獨,還有漢諾塔,分形。
由于堆棧的機制,一般的遞歸可以保留某些變量在歷史狀態(tài)中,比如你提到的return x * power..., 但是某些或許龐大的問題或者是深度過大的問題就需要盡量避免遞歸,因為可能會棧溢出。還有一個問題是~python不支持尾遞歸優(yōu)化?。。?!所以~還是盡量避免遞歸的出現(xiàn)。
def power(x, n)
if n 0:
return 1
return x * power(x, n - 1)
power(3, 3)
3 * power(3, 2)
3 * (3 * power(3, 1))
3 * (3 * (3 * power(3, 0)))
3 * (3 * (3 * 1)) 這里n = 0, return 1
3 * (3 * 3)
3 * 9
27
當(dāng)函數(shù)形參n=0的時候,開始回退~直到第一次調(diào)用power結(jié)束。
首先這是個遞歸函數(shù),功能是將一個10進制數(shù),轉(zhuǎn)換成一個其他進制的數(shù),這里轉(zhuǎn)換只是將結(jié)果打印出來。
遞歸這么調(diào)用foo(126,2)-foo(63,2),0-foo(31,2),1,0-foo(15,2),1,1,0-foo(7,2),1,1,1,0-foo(3,2),1,1,1,1,0-foo(1,2),1,1,1,1,1,0-1,1,1,1,1,0(共5個1,這個程序?qū)懙钠鋵嵅⒉粚Α?有函數(shù)表示前面的先算出來,后面才能打印。所以雖然0是最先要打印的,但是卻在最后一位,那是因為print放在函數(shù)調(diào)用的后面。
這個函數(shù)的應(yīng)該在print后面加一句elif num0:print num這句和if縮進相同,這個程序的功能才正常,否則最高位會缺失。
不明白可追問。