Python巧解數(shù)字變換問題,有點意思(65)
小朋友們好,大朋友們好!
我是貓妹,一名愛上Python編程的小學(xué)生。
和貓妹學(xué)Python,一起趣味學(xué)編程。

今日主題
如何用Python解決數(shù)字變換問題
比如:
對于一對正整數(shù)a和b,對a只能進行加1,減1,乘2操作,問最少對a進行幾次操作能得到b?
a=3,b=11,3*2*2-1=11,3次操作得到11
編程思路
數(shù)字變換問題屬于狀態(tài)遷移圖問題,可以用廣度優(yōu)先搜索,尋找a到b狀態(tài)遷移最短路徑。
對于每個狀態(tài)s,可以轉(zhuǎn)換到是s+1、s-1、s*2。
編程步驟:
1.把初始狀態(tài)a入隊
2.出隊一個狀態(tài)s,然后把s+1,s-1,s*2入隊
3.反復(fù)循環(huán)2,直到狀態(tài)s為b
今日主題
代碼實現(xiàn)(代碼見同名公眾號,次條推文):

代碼邏輯:
3行:函數(shù)atob的參數(shù)a和b,表示起始數(shù)據(jù)a,終點數(shù)據(jù)b,返回值c表示經(jīng)過的變換次數(shù)。
4行:創(chuàng)建一個隊列,隊列元素為元組。元組中第一個元素為當(dāng)前數(shù)字、第二個元素為經(jīng)過的變換次數(shù)。
5行:已經(jīng)經(jīng)過判斷過但是不符合的數(shù)字,需要將其過濾掉。
避免重復(fù)判斷,比如+1-1無限循環(huán)。
6~21行:依次從隊列中取出一個元素,判斷是否滿足要求。
如果滿足要求,退出循環(huán)。否則,將其變換值(+1,-1,*2)加入隊列。
7行:從隊列中彈出一個元素,該元素為元組。s,c分別表示當(dāng)前數(shù)字,經(jīng)過變換的次數(shù)。
8~9行:經(jīng)過的變換等于預(yù)期值,退出循環(huán)。
11~17行:當(dāng)前數(shù)字小于預(yù)期值時,允許它向大處變換。
新的狀態(tài)值之前沒有被判斷過,才可以加入隊列,才可以加入已判斷集合。
18~21行:當(dāng)前數(shù)字大于預(yù)期值時,允許它向小處變換。
新的狀態(tài)值之前沒有被判斷過,才可以加入隊列,才可以加入已判斷集合。
22行:返回經(jīng)過的變換次數(shù)。

怎么樣?
你理解了嗎?

好了,我們今天就學(xué)到這里吧!
如果遇到什么問題,咱們多多交流,共同解決。
我是貓妹,咱們下次見!