Python遞歸實(shí)現(xiàn)猴子吃桃問題及解析
Python遞歸實(shí)現(xiàn)猴子吃桃
猴子吃桃問題:猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不癮,又多吃了一個(gè)。第二天早上又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天早上都吃了前一天剩的一半零一個(gè)。到第10天早上想再吃時(shí),見只剩下一個(gè)桃子了,求第一天共摘了多少桃子?
對于此性質(zhì)的問題適合用遞歸的思想去解決,即當(dāng)前問題可以轉(zhuǎn)化為性質(zhì)相同的子問題去解決:
要想知道第一天的桃子數(shù)量,需要知道第二天的桃子數(shù)量,然后將第二天的桃子數(shù)量加1乘以2就可以得到第一天的桃子數(shù)量。按照此法進(jìn)行倒推,我已知道第十天的桃子數(shù)量為1個(gè),則第九天的桃子數(shù)量為第10天的桃子數(shù)量加1乘以2,第八天的桃子數(shù)量等于第九天的數(shù)量加1再乘以2,...
則可以定義函數(shù)去實(shí)現(xiàn):n代表天數(shù),如果輸入的n不合理,則直接退出函數(shù),如果n等于10,則返回1,否則返回其后面天數(shù)桃子數(shù)量加1再乘以2
代碼如下:
def monkey_tao(n): if n>10 or n<1: return elif n==10: return 1 else: return (monkey_tao(n+1)+1)*2 print (monkey_tao(1))
Python函數(shù)(閏年&猴子偷桃)問題
函數(shù)
1. 函數(shù)簡介
- 函數(shù)也是一個(gè)對象
- 函數(shù)用來保存一些可執(zhí)行的代碼,并且可以在需要時(shí),對這些語句進(jìn)行多次調(diào)用
- 語法:
def 函數(shù)名([形參1,形參2,形參3....]): ? ? 代碼塊
注意:
- 函數(shù)名必須符合標(biāo)識符的規(guī)范(可以包含字母、數(shù)字、下劃線但是不能以數(shù)字開頭)
print是函數(shù)對象 print()是調(diào)用函數(shù)
函數(shù)的參數(shù)
形參和實(shí)參
- 形參(形式參數(shù)) 定義形參就相當(dāng)于在函數(shù)內(nèi)部聲明了變量,但是并不是賦值
- 實(shí)參(實(shí)際參數(shù))指定了形參,那么在調(diào)用函數(shù)時(shí)必須傳遞實(shí)參,實(shí)參將會(huì)賦值給對應(yīng)的形參,簡單來說有幾個(gè)形參就要有幾個(gè)實(shí)參
函數(shù)的傳遞方式
- 定義形參時(shí),可以為形參指定默認(rèn)值。指定了默認(rèn)值以后,如果用戶傳遞了參數(shù)則默認(rèn)值不會(huì)生效。如果用戶沒有傳遞,則默認(rèn)值就會(huì)生效
- 位置參數(shù):位置參數(shù)就是將對應(yīng)位置的實(shí)參賦值給對應(yīng)位置的形參
- 關(guān)鍵字參數(shù) : 關(guān)鍵字參數(shù)可以不按照形參定義的順序去傳遞,而根據(jù)參數(shù)名進(jìn)行傳遞
- 混合使用位置參數(shù)和關(guān)鍵字參數(shù)的時(shí)候必須將位置參數(shù)寫到關(guān)鍵字參數(shù)前面去
不定長參數(shù)
- 定義函數(shù)時(shí),可以在形參前面加一個(gè)*,這樣這個(gè)形參可以獲取到所有的實(shí)參,它會(huì)將所有的實(shí)參保存到一個(gè)元組中
- 帶*號的形參只能有一個(gè),可以和其他參數(shù)配合使用
- *形參只能接受位置參數(shù),不能接受關(guān)鍵字參數(shù)
- **形參可以接收其他的關(guān)鍵字參數(shù),它會(huì)將這些參數(shù)統(tǒng)一保存到字典當(dāng)中。字典的key就是參數(shù)的名字,字典的value就是參數(shù)的值
- **形參只有一個(gè),并且必須寫在所有參數(shù)的后面
參數(shù)的解包
- 傳遞實(shí)參時(shí),也可以在序列類型的參數(shù)前添加星號,這樣它會(huì)自動(dòng)的將序列中元素依次作為參數(shù)傳遞
- 要求序列中的元素的個(gè)數(shù)必須和形參的個(gè)數(shù)一致 函數(shù)中
1.函數(shù)的返回值
- 返回值就是函數(shù)執(zhí)行以后返回的結(jié)果
- 通過return來指定函數(shù)的返回值
- return后面可以跟任意對象,返回值甚至可以是一個(gè)函數(shù)
2.文檔字符串
- help()是Python中內(nèi)置函數(shù),通過help()函數(shù)可以查詢Python中函數(shù)的用法
- 在定義函數(shù)時(shí),可以在函數(shù)內(nèi)部編寫文檔字符串,文檔字符串就是對函數(shù)的說明
函數(shù)的作用域
- 作用域(scope)
- 作用域指的是變量生效的區(qū)域
- 在Python中一共有兩種作用域
- 全局作用域
全局作用域在程序執(zhí)行時(shí)創(chuàng)建,在程序執(zhí)行結(jié)束時(shí)銷毀
所有函數(shù)以外的區(qū)域都是全局作用域
在全局作用域中定義的變量,都是全局變量,全局變量可以在程序的任意位置進(jìn)行訪問
函數(shù)作用域
- 函數(shù)作用域在函數(shù)調(diào)用時(shí)創(chuàng)建,在調(diào)用結(jié)束時(shí)銷毀
- 函數(shù)每調(diào)用一次就會(huì)產(chǎn)生一個(gè)新的函數(shù)作用域
- 在函數(shù)作用域中定義的變量,都是局部變量,它只能在函數(shù)內(nèi)部被訪問
命名空間
- 命名空間實(shí)際上就是一個(gè)字典,是一個(gè)專門用來存儲(chǔ)變量的字典
- locals()用來獲取當(dāng)前作用域的命名空間
- 如果在全局作用域中調(diào)用locals()則獲取全局命名空間,如果在函數(shù)作用域中調(diào)用locals()則獲取函數(shù)命名空間
- 返回值是一個(gè)字典
遞歸函數(shù)
- 遞歸是解決問題的一種方式,它的整體思想,是將一個(gè)大問題分解為一個(gè)個(gè)的小問題,直到問題無法分解時(shí),在去解決問題
- 遞歸式函數(shù)有2個(gè)條件
基線條件 問題可以被分解為最小問題,當(dāng)滿足基線條件時(shí),遞歸就不執(zhí)行了
遞歸條件 可以將問題繼續(xù)分解的條件
作業(yè)
閏年
用函數(shù)實(shí)現(xiàn)一個(gè)判斷用戶輸入的年份是否是閏年的程序
- 能被400整除的年份
- 能被4整除,但是不能被100整除的年份
以上2種方法滿足一種即為閏年
def leap_year(): i = int(input('請輸入一個(gè)年份:')) if i%400 == 0 or (i%4 == 0 and i%100 != 0): print('此年分是閏年') else: print('次年分不是閏年') leap_year()
運(yùn)行結(jié)果:
猴子吃桃問題(遞歸)
猴子第一天摘下若干個(gè)桃子,當(dāng)即吃了一半,還不癮,又多吃了一個(gè)。第二天早上又將剩下的桃子吃掉一半,又多吃了一個(gè)。以后每天早上都吃了前一天剩的一半零一個(gè)。到第10天早上想再吃時(shí),見只剩下一個(gè)桃子了,求第一天共摘了多少桃子?
def hou_tao(i, x): # i為天數(shù) x為剩余桃子數(shù) if i == 1: return x else: return (hou_tao(i-1, x) + 1)*2 print(f'第一天共摘{hou_tao(10, 1)}個(gè)桃子')
運(yùn)行結(jié)果:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python的scrapy框架之Pipeline文件的用法詳解
這篇文章主要介紹了python的scrapy框架之Pipeline文件的用法詳解,Pipeline是一個(gè)獨(dú)立的模塊,用于處理從Spider中提取的Item對象,實(shí)現(xiàn)對數(shù)據(jù)的進(jìn)一步處理、存儲(chǔ)和清洗等操作,下面將詳細(xì)介紹Scrapy框架中Pipeline的用法,需要的朋友可以參考下2023-10-10Python實(shí)現(xiàn)向服務(wù)器請求壓縮數(shù)據(jù)及解壓縮數(shù)據(jù)的方法示例
這篇文章主要介紹了Python實(shí)現(xiàn)向服務(wù)器請求壓縮數(shù)據(jù)及解壓縮數(shù)據(jù)的方法,涉及Python文件傳輸及zip文件相關(guān)操作技巧,需要的朋友可以參考下2017-06-06python MultipartEncoder傳輸zip文件實(shí)例
這篇文章主要介紹了python MultipartEncoder傳輸zip文件實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python實(shí)現(xiàn)21點(diǎn)小游戲的示例代碼
1931年,當(dāng)美國內(nèi)華達(dá)州宣布賭博為合法活動(dòng)時(shí),21點(diǎn)游戲第一次公開出現(xiàn)在內(nèi)華達(dá)州的賭場俱樂部,15年內(nèi),它取代擲骰子游戲,而一舉成為非常流行的賭場莊家參與的賭博游戲。本文將用Python實(shí)現(xiàn)這一經(jīng)典游戲,感興趣的可以了解一下2022-09-09使用matplotlib創(chuàng)建Gif動(dòng)圖的實(shí)現(xiàn)
本文主要介紹了使用matplotlib創(chuàng)建Gif動(dòng)圖的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Python實(shí)現(xiàn)的Google IP 可用性檢測腳本
這篇文章主要介紹了Python實(shí)現(xiàn)的Google IP 可用性檢測腳本,本文腳本需要Python 3.4+環(huán)境,需要的朋友可以參考下2015-04-04