Python中如何用变量m实现通用逻辑,替代多条件语句(Rosalind Fibd)
解决Rosalind Fibd问题的通用化实现方案
我懂你现在的烦恼——为每个m值写一堆elif实在太繁琐,扩展性也差。其实你已经摸到了问题的规律,只是没把它提炼成通用逻辑而已。先看看你原有代码里的模式:
不管m取多少,每一轮的操作都能拆成两个核心步骤:
- 新出生的兔子数量:总是所有年龄大于1个月的兔子总和(也就是
rabbits[1]到rabbits[m-1]的和) - 年龄更新:每个年龄组的兔子向更老的年龄段移动一位,最老的那组兔子会自然死亡(被移出或覆盖)
基于这个规律,我们完全可以用通用逻辑替代硬编码的条件语句,不管m是2还是20都能适用。
优化后的代码(原地修改版)
这个版本不会创建新列表,内存效率更高:
def fibonnaciMortalRabbit(n, m): # 初始化m个年龄组,索引0代表1个月大的兔子,索引m-1代表m个月大的(即将死亡) rabbits = [0] * m # 初始的第一对兔子属于1个月大的组 rabbits[0] = 1 # 模拟n-1次时间推移(初始状态是第1个月) for _ in range(n - 1): # 计算新出生的兔子:所有能繁殖的兔子总和(年龄>=1个月) new_born = sum(rabbits[1:]) # 从后往前更新年龄组,避免覆盖还没用到的值 for i in range(m-1, 0, -1): rabbits[i] = rabbits[i-1] # 新出生的兔子进入1个月大的组 rabbits[0] = new_born return sum(rabbits) # 测试你的示例 print(fibonnaciMortalRabbit(8, 2)) # 输出5,和原来的结果一致
更简洁的切片版
如果你觉得循环更新麻烦,用列表切片可以一行搞定年龄更新,代码更易读:
def fibonnaciMortalRabbit(n, m): rabbits = [0] * m rabbits[0] = 1 for _ in range(n - 1): new_born = sum(rabbits[1:]) # 新列表:新出生的兔子放最前面,后面跟上原列表去掉最后一个元素(最老的兔子死亡) rabbits = [new_born] + rabbits[:-1] return sum(rabbits)
为什么这个逻辑和你原来的代码等价?
拿m=3的情况举例:
- 原来的代码是
rabbits[0], rabbits[1], rabbits[2] = rabbits[1]+rabbits[2], rabbits[0], rabbits[1] - 优化后的逻辑里,
new_born = rabbits[1]+rabbits[2],然后rabbits[2] = rabbits[1],rabbits[1] = rabbits[0],最后rabbits[0] = new_born,完全和原来的赋值顺序一致,结果自然相同。
这样不管m是多少,都不用再写一堆elif了,直接把m当变量用就行,完美适配m<20的要求。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

