004. FIB(Rabbits and Recurrence Relations)+費波那契數遞迴

更新於 發佈於 閱讀時間約 5 分鐘

題目連結

這題稍稍有點複雜、讓人看不懂

因為題目敘述同時提到了「費氏數列」、「繁殖模型」


但是費氏數列的觀點,在這題可以不要用到,只需要以直觀的概念思考即可


首先來看題目

輸入

5 3​

輸出

19


三小??

為何這兩個數字湊在一起會冒出19?

不可能呀,根本八竿子打不著


哦,原來是

輸入的5是回合數,每一對成熟兔每回合能夠生出3對小兔子

在最初的第一個月只有一隻小兔子

並且不用考慮兔子公母、奇偶數量的問題(都是以“一對”來做計算)

raw-image


迭代解法(較直觀):

n, k = 5, 3  # n:回合數、k:每次繁衍數
R, r = 0, 1 # R: 成熟兔數量、r: 初生兔數量

for i in range(n - 1): # 初始狀態已經是第1個月,所以n-1
new_born = R * k # 上一輪的成熟兔生小孩了
R += r # 上一輪的初生兔子成熟了
r = new_born

print(R + r)



更精簡的版本(費波那契風格迭代)

def rabbit_population(n, k):
R, r = 0, 1 # R: 成熟兔數量、r: 初生兔數量

for _ in range(1, n):
R, r = r, r + k * R
return r

print(rabbit_population(5, 3))


費氏數列

F(n) = F(n-1) + F(n-2)
vs
F(n) = F(n-1) + k * F(n-2)

遞迴(recursive)解法:

def rabbit_population(n, k):
if n == 1 or n == 2: # 尚未繁殖,前兩個月都只有一對兔子
return 1

# 第n個月兔總數 = 前一個月的兔總數 + 新出生的
# 新出生的:前一個月成熟兔*k => 前一個月成熟兔數量怎麼計算?就是前兩個月兔總數
return rabbit_population(n - 1, k) + rabbit_population(n - 2, k) * k

print(rabbit_population(5, 3))


遞迴解法,既不直觀、執行速度又慢

但是在“概念表達”上非常清晰

站在「自我複製」這點的立場就很容易明白,以每個個體的功能角度來思考







BTW,此題目敘述會讓人誤會的地方:

  1. 沒有明確提到幾個月才變成成熟的兔子、具有繁衍能力
  2. 以「兔子交配」為例反而摻雜過多的資訊:
    究竟是一對才能生 or 一隻就能繁衍?
    若給定「奇數隻」,父母是否需要-1來取偶數?
    是不是要一公一母?


---


如果換作我出題,我的思路如下:

1. 排除掉異性因素,以「細菌」為例:

只需要複製自己就能繁殖

以細菌為例看似合理恰當,可是在「k分裂法」會有問題

因為 細菌or細胞 雖是無性繁殖,但只存在「二分裂法」

題目就需要額外說明這是「特異的菌」,每次可以複製k組DNA...



2. 排除掉「二分裂法」的因素

2-1 以「樹枝冒出枝枒」為例:

一個枝幹,每個月會長出k個新枝枒
每個新枝枒在一個月後會成熟、變成枝幹,每個月分出k個新枝枒

但是不適合的點在於:

普遍會認為樹狀結構是「一次性分支」,樹枝長一次就固定了

要想像成每月長新枝枒,會不直觀

甚至想到那個畫面有點會噁心(老舊枝幹還一直冒出新枝枒...已經長出祖宗180代了)



2-2 若以「病毒複製」為例:

病毒在宿主細胞內複製
一個病毒感染了宿主細胞,經過一輪後,能從細胞中爆出k個新病毒

但通常爆完之後,就沒辦法再爆第二次了

(若細胞能再爆第二次、第三次,那畫面也非常噁心...)

似乎與上樹「樹枝枝枒」的模式相同



2-3 若以「病毒擴散」為例:

社會式的傳播
一個感染者經過潛伏期後,每輪會傳染k個新的人,並持續傳染下去
對於新感染者,在潛伏期後,也開始每輪傳染k個人。

每個感染者都能提供「持續的影響力」

病毒擴散模型,似乎是至今最恰當、最貼切的比喻



3. 遊戲化版本:「黏土分身」

一個魔法黏土人,在成形後可以每回合捏出k個新分身
每個新分身需要1回合凝固成行,之後就能繼續分裂

直接創造一個全新的概念

規則清楚的遊戲模型,不受生物學真實限制

看起來也更有趣


留言
avatar-img
留言分享你的想法!
avatar-img
生物資訊實驗室
0會員
17內容數
這裡存放著滿滿的大平台!Rosalind 生物資訊解題平台的學習過程! 📢 適合對象: ✅ 想學習生物資訊的程式新手 ✅ 對Python程式有基礎,想挑戰 Rosalind 題目的解題者 ✅ 對DNA、蛋白質、基因組數據分析有興趣的人
生物資訊實驗室的其他內容
2025/04/16
題目連結 密碼子為三個鹼基一組的序列 就像把一段RNA序列拆包、逐個decode成對應的蛋白質字母 輸入 AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA 輸出 MAMAPRTEINSTRING 首先就是要建立出密碼
Thumbnail
2025/04/16
題目連結 密碼子為三個鹼基一組的序列 就像把一段RNA序列拆包、逐個decode成對應的蛋白質字母 輸入 AUGGCCAUGGCGCCCAGAACUGAGAUCAAUAGUACCCGUAUUAACGGGUGA 輸出 MAMAPRTEINSTRING 首先就是要建立出密碼
Thumbnail
2025/04/12
題目連結 孟德爾第一定律(Mendel's First Law),是遺傳學中的分離律 題目輸入 2 2 2 輸出 0.78333 蛤??? 當三個2擺在一起 怎麼計算也不會是這個數字吧? 不可能,絕對不可能! 這麼醜的數字0.78333到底是怎麼湊來的? 幾
Thumbnail
2025/04/12
題目連結 孟德爾第一定律(Mendel's First Law),是遺傳學中的分離律 題目輸入 2 2 2 輸出 0.78333 蛤??? 當三個2擺在一起 怎麼計算也不會是這個數字吧? 不可能,絕對不可能! 這麼醜的數字0.78333到底是怎麼湊來的? 幾
Thumbnail
2025/04/06
題目連結 今天文章比較長,要冷靜忍耐一下 (文末有提到zip()與asterisk星號用法,篇幅hen長) 輸入兩基因序列,比對這兩序列中有幾個不一樣的地方。 計算兩字串不同字符的個數,這個就稱為漢明距離 (Hamming distance) 11110000 01110001
Thumbnail
2025/04/06
題目連結 今天文章比較長,要冷靜忍耐一下 (文末有提到zip()與asterisk星號用法,篇幅hen長) 輸入兩基因序列,比對這兩序列中有幾個不一樣的地方。 計算兩字串不同字符的個數,這個就稱為漢明距離 (Hamming distance) 11110000 01110001
Thumbnail
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
題目連結 這題稍稍有點複雜、讓人看不懂 因為題目敘述同時提到了「費氏數列」、「繁殖模型」 但是費氏數列的觀點,在這題可以不要用到,只需要以直觀的概念思考即可 首先來看題目 輸入 5 3​ 輸出 19 三小?? 為何這兩個數字湊在一起會冒出19? 不可能呀,根本八竿子
Thumbnail
題目連結 這題稍稍有點複雜、讓人看不懂 因為題目敘述同時提到了「費氏數列」、「繁殖模型」 但是費氏數列的觀點,在這題可以不要用到,只需要以直觀的概念思考即可 首先來看題目 輸入 5 3​ 輸出 19 三小?? 為何這兩個數字湊在一起會冒出19? 不可能呀,根本八竿子
Thumbnail
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
Thumbnail
題目敘述 Distinct Subsequences 給定一個字串s和目標t,請問有多少個s的子序列可以完美匹配目標t ? 也就是說,有多少個s的子序列和目標t相等? 測試範例 Input: s = "rabbbit", t = "rabbit" Output: 3
Thumbnail
這題主要是在考 RSA 加密演算法,為此我還特地去研究了費馬小定理、尤拉定理、RSA演算法證明,但也因此把自己弄得頭昏眼花。讓我們一起看看這困難的一題吧。
Thumbnail
這題主要是在考 RSA 加密演算法,為此我還特地去研究了費馬小定理、尤拉定理、RSA演算法證明,但也因此把自己弄得頭昏眼花。讓我們一起看看這困難的一題吧。
Thumbnail
在看完了咚咚的思辨學堂老師的機率的排列組合 – 在數學上要多加留意題目裡的「換句話說」後。 那題代數轉塗色問題我是真的沒想到。(學會了!😆😆😆) 我決定我也來出幾題。 難度稍高? 邀請大神一同作答激盪出不同的解法。 (一)5對兄妹共舞,若每一兄均不與其妹為舞伴,則共有      
Thumbnail
在看完了咚咚的思辨學堂老師的機率的排列組合 – 在數學上要多加留意題目裡的「換句話說」後。 那題代數轉塗色問題我是真的沒想到。(學會了!😆😆😆) 我決定我也來出幾題。 難度稍高? 邀請大神一同作答激盪出不同的解法。 (一)5對兄妹共舞,若每一兄均不與其妹為舞伴,則共有      
Thumbnail
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
Thumbnail
題目敘述 輸入給定一個鏈結串列,整體看代表一個十進位的數字,各別看每個節點代表每個digit,分別從最高位~最低位個位數。 要求我們把原本的數字乘以二,並且以鏈結串列的形式返回答案。 原本的英文題目敘述
Thumbnail
題目敘述 題目會給定我們一個輸入陣列nums,要求我們掃描美個陣列元素nums[i],計算除了nums[i]以外的陣列元素連乘積。 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4] Output: [24,12,8,6] nums[0] 以
Thumbnail
題目敘述 題目會給定我們一個輸入陣列nums,要求我們掃描美個陣列元素nums[i],計算除了nums[i]以外的陣列元素連乘積。 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4] Output: [24,12,8,6] nums[0] 以
Thumbnail
題目敘述 題目會給定一個鏈結串列 Linked List的頭部結點,要求我們根據索引的奇偶數重新排列。奇數索引的在前,偶數索引的在後。數的時候,從Head節點的索引=1開始數。 例如: 1 -> 2 -> 3 -> 4 -> 5 重新排列為 1 -> 3 -> 5 -> 2 -> 4
Thumbnail
題目敘述 題目會給定一個鏈結串列 Linked List的頭部結點,要求我們根據索引的奇偶數重新排列。奇數索引的在前,偶數索引的在後。數的時候,從Head節點的索引=1開始數。 例如: 1 -> 2 -> 3 -> 4 -> 5 重新排列為 1 -> 3 -> 5 -> 2 -> 4
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,要求我們判斷輸入陣列nums內部是否存在長度為三的遞增子序列? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4,5] Output: true Explanation: Any triplet wh
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,要求我們判斷輸入陣列nums內部是否存在長度為三的遞增子序列? 題目的原文敘述 測試範例 Example 1: Input: nums = [1,2,3,4,5] Output: true Explanation: Any triplet wh
Thumbnail
題目敘述 題目會給定我們一個n值,要求我們列出從0 ~ n 之間,每個整數有幾個bit1,以陣列的形式返回答案。 例如n=3時 因為 0 = 0b 0 1 = 0b 1 2 = 0b 10 3 = 0b 11 輸出答案為[0, 1, 1, 2] 題目的原文敘述 測試範例 E
Thumbnail
題目敘述 題目會給定我們一個n值,要求我們列出從0 ~ n 之間,每個整數有幾個bit1,以陣列的形式返回答案。 例如n=3時 因為 0 = 0b 0 1 = 0b 1 2 = 0b 10 3 = 0b 11 輸出答案為[0, 1, 1, 2] 題目的原文敘述 測試範例 E
Thumbnail
題目敘述 題目會給我們一個參數k 和 目標值n。 請問我們從1~9內挑k個相異的數字,使得他們的總和為n 的組合數有多少? 挑選時,每個數字必須相異,而且每個數字只能選一次。 題目的原文敘述 測試範例 Example 1: Input: k = 3, n = 7 Output: [
Thumbnail
題目敘述 題目會給我們一個參數k 和 目標值n。 請問我們從1~9內挑k個相異的數字,使得他們的總和為n 的組合數有多少? 挑選時,每個數字必須相異,而且每個數字只能選一次。 題目的原文敘述 測試範例 Example 1: Input: k = 3, n = 7 Output: [
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News