V1

2022/11/24阅读：22主题：嫩青

# 2022-11-19 【生信】Mortal Fibonacci Rabbits

ROSALIND | Mortal Fibonacci Rabbits

## Problem

Figure 4. A figure illustrating the propagation of Fibonacci's rabbits if they die after three months.

Recall the definition of the Fibonacci numbers from “Rabbits and Recurrence Relations”, which followed the recurrence relation Fn=Fn−1+Fn−2Fn=Fn−1+Fn−2 and assumed that each pair of rabbits reaches maturity in one month and produces a single pair of offspring (one male, one female) each subsequent month.

Our aim is to somehow modify this recurrence relation to achieve a dynamic programming solution in the case that all rabbits die out after a fixed number of months. See Figure 4 for a depiction of a rabbit tree in which rabbits live for three months (meaning that they reproduce only twice before dying).

Given: Positive integers n≤100n≤100 and m≤20m≤20.

Return: The total number of pairs of rabbits that will remain after the nn-th month if all rabbits live for mm months.

## Sample Dataset

``6 3``

## Sample Output

``4``

### 我的解法

``class Rabbit():    __slots__ = ["lifespan", "age"]    def __init__(self, lifespan):        self.lifespan = lifespan        self.age = 1    def growUp(self):        self.age += 1    def death(self):        if self.age > self.lifespan:            return True        return False    def produce(self):        if self.age > 2:            return True        return Falsemonths = 6lifespan = 3totalRabbits = []rabbit = Rabbit(lifespan)totalRabbits.append(rabbit)def rabbitSeason(months, lifespan):    for month in range(1, months):        temp = [r for r in totalRabbits]        for rab in temp:            rab.growUp()            if rab.produce():                newRabbit = Rabbit(lifespan)                totalRabbits.append(newRabbit)            if rab.death():                totalRabbits.remove(rab)rabbitSeason(months,lifespan)print(len(totalRabbits))``

8.4 创建大量对象时节省内存方法 — python3-cookbook 3.0.0 文档

# 8.4 创建大量对象时节省内存方法

## 解决方案

``class Date: __slots__ = ['year', 'month', 'day'] def __init__(self, year, month, day):     self.year = year     self.month = month     self.day = day``

### 提示

``# m=3   [1, 1, 2, 2, 3, 4, 5, 7, 9, 12]        f(n) = f(n-2) + f(n-3)# m=4   [1, 1, 2, 3, 4, 6, 9, 13, 19, 28]      f(n) = f(n-2) + f(n-3) + f(n-4)# m=5   [1, 1, 2, 3, 5, 7, 11, 17, 26, 40]     f(n) = f(n-2) + f(n-3) + f(n-4) + f(n-5)# m=6   [1, 1, 2, 3, 5, 8, 12, 19, 30, 47]     f(n) = f(n-2) + f(n-3) + f(n-4) + f(n-5) + f(n-6)# m=7   [1, 1, 2, 3, 5, 8, 13, 20, 32, 51]     f(n) = f(n-2) + f(n-3) + f(n-4) + f(n-5) + f(n-6) + f(n-7)``

I found this rule in this problem, but I'm not sure that I will always lucky. Can I ask whether there is any principle to finding a rule for sequence of numbers?

Thanks.

### 2022-11-24 当天试了很多次，然后遇到一些事情，搁置了几天

【ROSALIND】【练Python，学生信】11 斐波那契数列与兔子繁殖问题之会死的兔子 - 哔哩哔哩 (bilibili.com)

``# 参考B站上的解法# 作者：未琢 https://www.bilibili.com/read/cv2017126 出处：bilibilii = 3n = 6m = 3f = [0, 1, 1]s = 0while i <= n:    if i <= m:        s = f[i-1] + f[i-2]    elif i == m+1:        s = f[i-1] + f[i-2] - 1    elif i > m+1:        s = f[i-1] + f[i-2] - f[i-m-1]    i += 1    f.append(s)print(f[n])``

`n` 代表当前月，也就是你要计算的月份数

`m` 兔子可以活的月份数

### 别人的解法

ROSALIND | Solutions | Mortal Fibonacci Rabbits

``#!/usr/bin/env pythondef fib(n,k=1):  ages = [1] + [0]*(k-1)  for i in xrange(n-1):    ages = [sum(ages[1:])] + ages[:-1]  return sum(ages)``

Python xrange() 函数 | 菜鸟教程 (runoob.com)

## 描述

xrange() 函数用法与 range 完全相同，所不同的是生成的不是一个数组，而是一个生成器。

## 语法

xrange 语法：

``xrange(stop)xrange(start, stop[, step])``

• start: 计数从 start 开始。默认是从 0 开始。例如 xrange(5) 等价于 xrange(0， 5)
• stop: 计数到 stop 结束，但不包括 stop。例如：xrange(0， 5) 是 [0, 1, 2, 3, 4] 没有 5
• step：步长，默认为1。例如：xrange(0， 5) 等价于 xrange(0, 5, 1)

## 返回值

``#!/usr/bin/python#Mortal Fibn=88k=16f=[1]*100for i in xrange(2,n):  f[i]=f[i-1]+f[i-2]  if i>=k:    f[i]-=f[(i-k)-1]  print f[i]``

### 尝试理解

``def fib(n,k=1):  ages = [1] + [0]*(k-1)  for i in range(n-1):      sums = [sum(ages[1:])]      addition = ages[:-1]      ages = sums + addition  return sum(ages)print(fib(6, 3))``

``  for i in range(n-1):      sums = [sum(ages[1:])]      addition = ages[:-1]      ages = sums + addition``

V1