python - 具有可变繁殖力的斐波那契凡人兔子

标签 python fibonacci rosalind

我正在尝试修改斐波那契凡人兔子的Python代码,以便根据兔子的年龄来改变兔子的繁殖力。 让我们举个例子。

我的兔子3个月后成熟,6个月后死亡。在 4 个月的繁殖期中,它们根据年龄产生不同数量的后代。当它们3个月大时产下2对兔子,4个月大时产下3对兔子,以此类推直到第六个月。每对兔子都是由一只雌性和一只雄性组成。最后我会计算成对的数量而不是个体的数量。 从出生到死亡的生育力值:

fecundity = [0, 0, 2, 3, 3, 1]

我正在使用的Python代码(https://github.com/jschendel/Rosalind/blob/master/011_FIBD.py)是:

n = 12
m = 6
#n = months to run
#m = how many months the rabbits live

# Populate the initial rabbits.
Rabbits = [1]+[0]*(m-1)

# Calculate the new rabbits (bunnies), in a given month.
# Start at use range(1,n) since our initial population is 0 month old.
for month in range(1, n):
    Bunnies = 0
    # Get the number of Rabbits able to old enough to give birth.
    for j in range(1,m):
        Bunnies += Rabbits[(month-j-1)%m]
    # Bunnies replace the old rabbits who died.
    Rabbits[(month)%m] = Bunnies

# Total rabbits is the sum of the living rabbits.
Total_Rabbits = sum(Rabbits)

我不知道如何实现繁殖力的变化。如有任何帮助,我们将不胜感激!

谢谢你, 瓦伦蒂娜

最佳答案

定义繁殖力数组以在兔子死亡时停止:

fecundity = [0, 0, 2, 3, 3, 1]

表示您的兔子在 7 个月大时死亡。 之后,您只需编写一个递归函数来计算特定步骤中 new_born 的数量。我将步骤初始化为 1 对表示步骤 0,0 对表示步骤 < 0。您当然可以更改它以适合您的情况。 (我所说的一步是一个时间单位,这里是月)。 这是函数:

def new_borns(step):
    if step < 0:
        return 0
    if step == 0:
        return 1
    nb_newborns = 0
    # We create a loop on living pairs
    for old_step in range(1, len(fecondity) +1):
        nb_newborns += (fecundity[old_step -1]) * new_borns(step - old_step)
    return nb_newborns

特定步骤的总人口是之前步骤中仍存活的新生婴儿总数(即,生育力数组的长度)。

def FIBD(step):
    population = 0
    for i in range(len(fecundity)):
        population += new_borns(step - i)
    return population

要知道第 7 步有多少对,只需调用 FIBD(7) 兔子能活的月数就是繁殖力数组的长度。

当然,这个递归函数非常非常慢而且不好。您需要一个缓存系统来避免对同一步骤进行多次计算。这是要写入的完整文件。

#!/usr/bin/env python

fecundity = [0, 0, 2, 3, 3, 1]
new_borns_cache = [1]

def new_borns(step):
    if step < 0:
        return 0
    try :
        return new_borns_cache[step]
    except IndexError:
        if step == 0:
            return 1
        sum = 0
        for old_step in range(1, len(fecundity) +1):
            sum += (fecundity[old_step -1]) * new_borns(step - old_step)
        return sum

def fibd(step):
    population = 0
    for i in range(len(fecundity)):
        population += new_borns(step - i)
    return population

要使用它,只需导入 ,然后调用 fibd(7)

关于python - 具有可变繁殖力的斐波那契凡人兔子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35914787/

相关文章:

java - 斐波那契数列错误

algorithm - 为什么计算斐波那契数列的递归方法的时间复杂度是2^n而不是2^n^2?

python - 计算 pandas DataFrame 中值的频率

python - 如何加入词典

python - Sonar : is there a way to add custom rules for python using Java

python - 返回 Unicode 字符串与返回编码为 UTF-8 的普通字符串?

python - 编写一个测试程序,每行打印从 1 到 Z 的十个字符

algorithm - 证明斐波那契递归算法的时间复杂度

performance - 在 DNA 中寻找基序

python - 用元组填充列表