水手分椰子是一道挺有名的趣味數(shù)學(xué)題,有利于我們理解遞歸的算法:有三個(gè)水手和寵物狗因船只觸礁被困在一個(gè)荒島上,島上僅有的食物是椰子,三個(gè)水手齊心協(xié)力摘了很多椰子。天黑了,他們決定去睡覺,等第二天醒來再分配椰子。當(dāng)天夜里,一個(gè)水手醒來,決定拿走屬于他的那份椰子而不想等到早上。他把椰子分為相等的三堆,但發(fā)現(xiàn)多出了一個(gè)椰子,于是把這個(gè)椰子給了寵物狗。接著他藏好了自己那份椰子就去睡覺了。不久,另一個(gè)水手也醒來,他做了與第一個(gè)水手同樣的事,也把多出的一個(gè)椰子給了寵物狗。而當(dāng)?shù)谌齻€(gè)水手醒來后,他也跟前兩個(gè)水手一樣分了椰子,也把多出的一個(gè)椰子給了寵物狗。第二天三名水手起床,決定把椰子平分三堆,每人一份,并把多出的一個(gè)也給了寵物狗,那么請(qǐng)問水手們一共摘了多少個(gè)椰子呢?
根據(jù)題目的描述,每個(gè)水手醒來之后將椰子分成三份,把自己一份藏起來了,留兩份給其他水手,一共分了四次椰子。我們可以采用枚舉法,讓椰子數(shù)從4開始(4是我們假設(shè)的數(shù)字,假設(shè)最后每個(gè)水手得到一只椰子,寵物狗也得到一只椰子,一共是4只椰子),然后依次從4開始遞增,并按照枚舉法判斷椰子是否能夠分完,如果剛好分完停止程序得出最終的答案,否則的話繼續(xù)增加椰子數(shù)量再次進(jìn)行判斷,直到椰子全部分完。接下來用一張流程圖來把我們的思路給整理一下:
下面我們按照流程圖的思路開始編寫代碼,首先新建一個(gè)變量X,假設(shè)最后只剩下4只椰子則X的初始值為4開始。并且增加判斷變量“椰子是否分完”其初始值為0。接著指令構(gòu)建一個(gè)循環(huán)結(jié)構(gòu),在循環(huán)體中逐漸增加變量X的值,這就完成了枚舉算法的基本結(jié)構(gòu)。對(duì)于每個(gè)X的值,我們需要調(diào)用自制的積木模塊進(jìn)行檢測,如果椰子能夠分完,結(jié)束循環(huán),輸出椰子的數(shù)量,這個(gè)值就是符合題意的最小值,否則的話繼續(xù)檢測下一個(gè)X的值。
創(chuàng)建自制積木的時(shí)候我們需要添加“椰子數(shù)量”的數(shù)字參數(shù),并且新增加一個(gè)變量“椰子”用來存放每次傳入X的值,根據(jù)故事描述,三名水手夜里偷偷分了三次椰子,每次都是把一個(gè)椰子給了寵物狗,剩下的椰子平均分成三份,自己藏起來一份留下兩份,那么可以將過程表示為(((椰子數(shù)量-1)/3)*2)重復(fù)執(zhí)行三次。天亮之后,水手們又分了一次椰子,把剩下的一只椰子分給了寵物狗,其他的分成三份一人一份全部分完,所以我們還需要添加判斷椰子是否分完的判斷,如果(椰子-1)除以3的余數(shù)等于零就表示椰子全部分完,否則椰子沒有分完就需要X繼續(xù)增加1,繼續(xù)進(jìn)行枚舉。最終我們可以得出答案最少有79個(gè)椰子。
現(xiàn)在數(shù)學(xué)知識(shí)編程化的趨勢越來越明顯,我們在學(xué)習(xí)時(shí)都可以利用編程的思想進(jìn)行各種創(chuàng)作,我也會(huì)和大家分享更多有趣的編程小知識(shí)。