You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何用变量m实现通用逻辑,替代多条件语句(Rosalind Fibd)

解决Rosalind Fibd问题的通用化实现方案

我懂你现在的烦恼——为每个m值写一堆elif实在太繁琐,扩展性也差。其实你已经摸到了问题的规律,只是没把它提炼成通用逻辑而已。先看看你原有代码里的模式:

不管m取多少,每一轮的操作都能拆成两个核心步骤:

  1. 新出生的兔子数量:总是所有年龄大于1个月的兔子总和(也就是rabbits[1]到rabbits[m-1]的和)
  2. 年龄更新:每个年龄组的兔子向更老的年龄段移动一位,最老的那组兔子会自然死亡(被移出或覆盖)

基于这个规律,我们完全可以用通用逻辑替代硬编码的条件语句,不管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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:52:53