Python 2.7 带变量的递归Fibonacci算法

Python 2.7 带变量的递归Fibonacci算法,python-2.7,recursion,fibonacci,Python 2.7,Recursion,Fibonacci,我在python2.7中实现了一个与兔子种群繁殖相关的传统斐波那契递归 def fibonacci(n): if n is 0 or n is 1: return 1 else: return (fibonacci(n-1)+fibonacci(n-2)) 如果两只兔子交配一个月后,它们产下一只雄兔和一只雌兔,则该代码计算种群。现在我需要修改代码来计算种群,如果每对繁殖年龄的兔子产生一窝k对兔子,而不是只有1对。如何以递归的方式执行此操作?对于递归情况,什么是最合适的模型?好吧

我在python2.7中实现了一个与兔子种群繁殖相关的传统斐波那契递归

def fibonacci(n):
    if n is 0 or n is 1: return 1
    else: return (fibonacci(n-1)+fibonacci(n-2))

如果两只兔子交配一个月后,它们产下一只雄兔和一只雌兔,则该代码计算种群。现在我需要修改代码来计算种群,如果每对繁殖年龄的兔子产生一窝k对兔子,而不是只有1对。如何以递归的方式执行此操作?对于递归情况,什么是最合适的模型?

好吧,让我们试着推导序列,它也被称为k阶的多nacci序列。看看这个,了解更多有趣的花絮

基本规则是一样的:一对情侣需要1个月才能成熟

因此,在:

第0个月:1对存在

第1个月:1对成人

第2个月:1对存在成人+k对存在青年=1+k总数

第3个月:1+k对存在成人+k对存在青年=1+2k总计

第4个月:1+2k对存在成人+K1+k对存在青年=1+k3+k总数

第5个月:1+3k+k^2对存在成人+k 1+2k对存在青年=1+k4+3k总计

等等

请注意,每个月,兔子对的总数为k*两代大的成年数量+一代大的幼对数量。因此,第n代的兔子数量是k*第n-2代的兔子数量,因为这些现在都是成年兔子+第n-1代的兔子数量

数学上:f0=1,f1=1,fn=fn-1+k*fn-2

代码:

注:

此代码以0为基础:因此第5个月为n=4,依此类推

警告:这个序列的增长速度快得离谱,k越大,因此计算fibnum100,100可能需要一段时间。建议记忆化可以显著加速n的增加


更新:将代码更改为接受k作为参数,并稍微清理了我的代码格式。增加了对multinacci序列的引用

什么是数学递归关系?是f0=f1=k,fn+2=n+2选择k*fn+1+fn吗?这不是正确的模型,请参见下面的答案。不起作用,n=5和k=3的k-fibNum必须返回19,但您的实现返回的是40def fibonaccin,k:如果n为0或n为1:返回1,否则:返回fibonaccin-1,k+k*fibonaccin-2,kYou有一个off by 1错误。我的月份以0为基础,而你的月份以1为基础。n=4和k=3的函数返回19。我将修改我的函数以接受k作为参数,而不是在外部定义它。但我将使用与k-fibnum相同的if语句。顺便说一句,你的数学论点很好,恭喜你,你有一个off by 1的错误,我不是说代码是错误的,我是说你对结果的解释是错误的。在我的例子中,N=5和k=3应该返回40,因为它表示第6个月,而值19表示第5个月或N=4。
def fibnum(n, k):
    if n < 0:
         raise ValueError("n must be a positive value")
    if n is 0 or n is 1:
        return 1
    else: 
        return (fibnum(n-1, k) + k * fibnum(n-2, k))