原創(chuàng):XIAO油菜花
學(xué)習(xí)進(jìn)度記錄:
《零基礎(chǔ)入門學(xué)習(xí)Python》P23:函數(shù):遞歸是什么
《Python開發(fā)入門與爬蟲項(xiàng)目實(shí)戰(zhàn)》:Python中的函數(shù):遞歸查找
課后思考
0.遞歸在編程上的形式是如何表現(xiàn)的呢?
1.遞歸必須滿足哪兩個(gè)基本條件传藏?
2.思考一下然磷,按照遞歸的特性箭阶,在編程中有沒有不得不使用遞歸的情況罗岖?
3.用遞歸去計(jì)算階乘問題或斐波那契數(shù)列是很糟糕的算法呜象,你知道為什么嗎皮钠?
4.請聊一聊遞歸的優(yōu)缺點(diǎn)(無需官方陳詞艳汽,想到什么寫什么就可以)
答案
0.在編程上,遞歸表現(xiàn)為函數(shù)調(diào)用本身這么一個(gè)行為。
1.一怜庸、函數(shù)調(diào)用自身当犯;二、設(shè)置了正確的返回條件
2.例如漢諾塔割疾,目錄索引(因?yàn)槟阌肋h(yuǎn)不知道這個(gè)目錄里邊是否還有目錄)嚎卫,快速排序(二十世紀(jì)十大算法之一),樹結(jié)構(gòu)的定義等如果使用遞歸宏榕,會(huì)事半功倍拓诸,否則會(huì)導(dǎo)致程序無法實(shí)現(xiàn)或相當(dāng)難以理解。
3.遞歸的實(shí)現(xiàn)可以是函數(shù)自個(gè)兒調(diào)用自個(gè)兒麻昼,每次函數(shù)的調(diào)用都需要進(jìn)行壓棧奠支、彈棧、保存和恢復(fù)寄存器的棧操作抚芦,所以在這上邊是非常消耗時(shí)間和空間的倍谜。
另外,如果遞歸一旦忘記了返回叉抡,或者錯(cuò)誤的設(shè)置了返回條件尔崔,那么執(zhí)行這樣的遞歸代碼就會(huì)變成一個(gè)無底洞:只進(jìn)不出!
4.優(yōu)點(diǎn):
1)遞歸的基本思想是把規(guī)模大的問題轉(zhuǎn)變成規(guī)模小的問題組合卜壕,從而簡化問題的解決難度(例如漢諾塔游戲)您旁。
2)有些問題使用遞歸使得代碼簡潔易懂(例如你可以很容易的寫出前中后序的二叉樹遍歷的遞歸算法,但如果要寫出相應(yīng)的非遞歸算法就不是初學(xué)者可以做到的了轴捎。)
缺點(diǎn):
1)由于遞歸的原理是函數(shù)調(diào)用自個(gè)兒鹤盒,所以一旦大量的調(diào)用函數(shù)本身空間和時(shí)間消耗是“奢侈的”。
2)初學(xué)者很容易錯(cuò)誤的設(shè)置了返回條件侦副,導(dǎo)致遞歸代碼無休止調(diào)用侦锯,最終棧溢出,程序崩潰秦驯。
實(shí)戰(zhàn)
0.使用遞歸編寫一個(gè) power() 函數(shù)模擬內(nèi)建函數(shù) pow()尺碰,即 power(x, y) 為計(jì)算并返回 x 的 y 次冪的值。
#用迭代的方法
def power(x, y):
result = 1
while y > 0:
result *= x
y -= 1
print('%d的%d次冪是:%d' % (x, y, result))
#用遞歸的方法
def power(x, y):
if y:
return x * power(x, y-1)
else:
return 1
1.使用遞歸編寫一個(gè)函數(shù)译隘,利用歐幾里得算法求最大公約數(shù)亲桥,例如 gcd(x, y) 返回值為參數(shù) x 和參數(shù) y 的最大公約數(shù)。
def gcd(x,y):
if y:
return gcd(y, x%y)
else:
return x
如果你關(guān)注了我固耘,希望你監(jiān)督我题篷,鼓勵(lì)我,與我一起學(xué)習(xí)厅目,一起成長番枚!?