7-5Python之遞歸函數(shù)

在函數(shù)內(nèi)部经瓷,可以調(diào)用其他函數(shù)。如果一個(gè)函數(shù)在內(nèi)部調(diào)用自身本身茫经,這個(gè)函數(shù)就是遞歸函數(shù)。

舉個(gè)例子萎津,我們來計(jì)算階乘 n! = 1 * 2 * 3 * ... * n,用函數(shù) fact(n)表示抹镊,可以看出:

fact(n) = n! = 1 * 2 * 3 * ... * (n-1) * n = (n-1)! * n = fact(n-1) * n

所以锉屈,fact(n)可以表示為 n * fact(n-1),只有n=1時(shí)需要特殊處理垮耳。

于是颈渊,fact(n)用遞歸的方式寫出來就是:

def fact(n):
    if n==1:
        return 1
    return n * fact(n - 1)

上面就是一個(gè)遞歸函數(shù)≈辗穑可以試試:

>>> fact(1)
1
>>> fact(5)
120
>>> fact(100)
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000L

如果我們計(jì)算fact(5)俊嗽,可以根據(jù)函數(shù)定義看到計(jì)算過程如下:

===> fact(5)
===> 5 * fact(4)
===> 5 * (4 * fact(3))
===> 5 * (4 * (3 * fact(2)))
===> 5 * (4 * (3 * (2 * fact(1))))
===> 5 * (4 * (3 * (2 * 1)))
===> 5 * (4 * (3 * 2))
===> 5 * (4 * 6)
===> 5 * 24
===> 120

遞歸函數(shù)的優(yōu)點(diǎn)是定義簡(jiǎn)單,邏輯清晰铃彰。理論上绍豁,所有的遞歸函數(shù)都可以寫成循環(huán)的方式,但循環(huán)的邏輯不如遞歸清晰牙捉。

使用遞歸函數(shù)需要注意防止棧溢出竹揍。在計(jì)算機(jī)中,函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的邪铲,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用芬位,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回带到,棧就會(huì)減一層棧幀昧碉。由于棧的大小不是無限的,所以揽惹,遞歸調(diào)用的次數(shù)過多被饿,會(huì)導(dǎo)致棧溢出∮浪浚可以試試計(jì)算 fact(10000)锹漱。

任務(wù)

漢諾塔 (http://baike.baidu.com/view/191666.htm) 的移動(dòng)也可以看做是遞歸函數(shù)。
我們對(duì)柱子編號(hào)為a, b, c慕嚷,將所有圓盤從a移到c可以描述為:
如果a只有一個(gè)圓盤哥牍,可以直接移動(dòng)到c毕泌;
如果a有N個(gè)圓盤,可以看成a有1個(gè)圓盤(底盤) + (N-1)個(gè)圓盤嗅辣,首先需要把 (N-1) 個(gè)圓盤移動(dòng)到 b撼泛,然后,將 a的最后一個(gè)圓盤移動(dòng)到c澡谭,再將b的(N-1)個(gè)圓盤移動(dòng)到c愿题。
請(qǐng)編寫一個(gè)函數(shù),給定輸入 n, a, b, c蛙奖,打印出移動(dòng)的步驟:
move(n, a, b, c)
例如潘酗,輸入 move(2, 'A', 'B', 'C'),打印出:
A --> B

A --> C

B --> C

參考代碼:
def move(n, a, b, c):
    if n ==1:
        print a, '-->', c
        return
    move(n-1, a, c, b)
    print a, '-->', c
    move(n-1, b, a, c)
move(4, 'A', 'B', 'C')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雁仲,一起剝皮案震驚了整個(gè)濱河市仔夺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攒砖,老刑警劉巖缸兔,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吹艇,居然都是意外死亡惰蜜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門受神,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抛猖,“玉大人,你說我怎么就攤上這事路克≌两幔” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵精算,是天一觀的道長(zhǎng)瓢宦。 經(jīng)常有香客問我,道長(zhǎng)灰羽,這世上最難降的妖魔是什么驮履? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮廉嚼,結(jié)果婚禮上玫镐,老公的妹妹穿的比我還像新娘。我一直安慰自己怠噪,他們只是感情好恐似,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著傍念,像睡著了一般矫夷。 火紅的嫁衣襯著肌膚如雪葛闷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天双藕,我揣著相機(jī)與錄音淑趾,去河邊找鬼。 笑死忧陪,一個(gè)胖子當(dāng)著我的面吹牛扣泊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘶摊,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼延蟹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了更卒?” 一聲冷哼從身側(cè)響起等孵,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹂空,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體果录,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡上枕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弱恒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辨萍。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖返弹,靈堂內(nèi)的尸體忽然破棺而出锈玉,到底是詐尸還是另有隱情,我是刑警寧澤义起,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布拉背,位于F島的核電站,受9級(jí)特大地震影響默终,放射性物質(zhì)發(fā)生泄漏椅棺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一齐蔽、第九天 我趴在偏房一處隱蔽的房頂上張望两疚。 院中可真熱鬧,春花似錦含滴、人聲如沸诱渤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勺美。三九已至递胧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間励烦,已是汗流浹背谓着。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坛掠,地道東北人赊锚。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屉栓,于是被迫代替她去往敵國(guó)和親舷蒲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958...
    喵在野閱讀 465評(píng)論 0 4
  • 什么是函數(shù) 我們知道圓的面積計(jì)算公式為: S = πr2 當(dāng)我們知道半徑r的值時(shí)友多,就可以根據(jù)公式計(jì)算出面積牲平。假設(shè)我...
    _王子_閱讀 557評(píng)論 0 2
  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用。當(dāng)一個(gè)函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,629評(píng)論 1 19
  • 不要在產(chǎn)品形勢(shì)不利的時(shí)候找風(fēng)投域滥。風(fēng)投的錢也是錢纵柿,大家投錢靠的是獲利的可能性,而不是情懷启绰。 在找風(fēng)投前昂儒,先把業(yè)務(wù)模式...
    dec17閱讀 281評(píng)論 0 0
  • 大學(xué)生活里着倾,你有過多少難以忘記的第一次拾酝? 第一次談戀愛; 第一次參加社團(tuán)卡者; 第一次學(xué)輪滑蒿囤; 第一次逃課; 第一次掛...
    紫柴子閱讀 419評(píng)論 0 2