python学习-综合练习五(五人分鱼(优化解)、顺向、反向推导)
文章目錄
- 五人分魚(yú)
- 順推
- 反推
說(shuō)明:本篇博文的知識(shí)點(diǎn)大部分來(lái)自 Python3 實(shí)例
五人分魚(yú)
# A、B、C、D、E 五人在某天夜里合伙去捕魚(yú),到第二天凌晨時(shí)都疲憊不堪,于是各自找地方睡覺(jué)。 # 日上三桿,A 第一個(gè)醒來(lái),他將魚(yú)分為五份,把多余的一條魚(yú)扔掉,拿走自己的一份。 # B 第二個(gè)醒來(lái),也將魚(yú)分為五份,把多余的一條魚(yú)扔掉拿走自己的一份。 。 # C、D、E依次醒來(lái),也按同樣的方法拿魚(yú)。 # 問(wèn)他們臺(tái)伙至少捕了多少條魚(yú)?題干分析:
拿到這種題,如果手動(dòng)計(jì)算,首先想到的是列方程,求解。但是在程序中,那我們能做的其實(shí)就是控制循環(huán),然后不斷的進(jìn)行遍歷,選出符合條件的數(shù)值。
比如這道題,其實(shí)有兩條思路,第一條思路是順推,按照A->E的順序拿魚(yú)。第二條思路就是反推,按照E->A的順序拿魚(yú)計(jì)算。
順推
主要是理清思路比較麻煩,代碼還是挺簡(jiǎn)單的。
控制一個(gè)循環(huán),不斷讓數(shù)值fish +=1,然后循環(huán)里面一個(gè)for去判斷5次,每次都是fish -1對(duì)5取余等于0。找到這個(gè)數(shù),跳出循環(huán),打印出來(lái)的數(shù)值就是我們需要的數(shù)值。
然后我們遍歷,并不是每一個(gè)數(shù)值都要去遍歷,我們只對(duì) (total - 1) % 5 == 0 的數(shù)值去進(jìn)行計(jì)算,即在循環(huán)里面,可以直接使用 idx * 5 + 1之后的fish進(jìn)行計(jì)算。
·
減少了循環(huán)次數(shù),使用傳統(tǒng)方式,每個(gè)idx進(jìn)行計(jì)算,遍歷了3121次,而使用處理后的fish進(jìn)行計(jì)算,只循環(huán)了624次。
·
由此可見(jiàn),如果循環(huán)里面是復(fù)雜計(jì)算,這個(gè)耗時(shí)差距就會(huì)很大了。
下面看代碼:
運(yùn)行結(jié)果:
反推
這種題還有一種反向思維,即從最后一個(gè)人能分到的最少魚(yú)數(shù),反向推導(dǎo)。
但是我寫(xiě)了一段代碼,運(yùn)行處理結(jié)果不對(duì),我還需要調(diào)試一下。等我調(diào)試好,再把這里補(bǔ)充完整,如果有看到此部分,然后對(duì)反向推導(dǎo)有興趣的小伙伴,可以把代碼貼到評(píng)論區(qū)噢。
在此對(duì)文章內(nèi)容進(jìn)行補(bǔ)充:
參考文章為:
創(chuàng)新工廠面試題詳解:共打了多少魚(yú) – 正解 遞歸求解法
這里有很多干貨,并且針對(duì)這道題,有一句話很重要:
這道題有簡(jiǎn)單的數(shù)學(xué)解: X = 5^5 - (5-1);
這個(gè)確實(shí)很有意思,大家思考一下噢。
總結(jié)
以上是生活随笔為你收集整理的python学习-综合练习五(五人分鱼(优化解)、顺向、反向推导)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python学习-综合练习四(最大公约数
- 下一篇: 华硕 ROG Phone 7 系列手机没