具有变量的递归Fibonacci算法

时间:2014-08-04 02:40:00

标签: 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对)。我怎么能以递归的方式做到这一点?递归案例最合适的模型是什么?

1 个答案:

答案 0 :(得分:3)

让我们尝试推导出序列,也称为k阶的多nacci序列。有关更多有趣的花絮,请参阅此paper

基本规则是相同的:成对需要1个月才能成熟

因此:

第0个月:1对存在(年轻)

第1个月:1对存在(成人)

第2个月:存在1对(成人)+存在k对(年轻)= 1 + k总

第3个月:存在1 + k对(成人)+存在k对(年轻)= 1 + 2k

第4个月:存在1 + 2k对(成人)+ k(1 + k)对存在(年轻)= 1 + k(3 + k)总数

第5个月:1 + 3k + k ^ 2对存在(成人)+ k(1 + 2k)对存在(年轻)= 1 + k(4 + 3k)总数

依旧......


请注意,每个月,兔子对的总数是k *成年人数(两代人)+年轻人数(1代人)。因此,n代兔的数量是n + 2代兔的k *数(因为这些都是成年人)+ n代1只兔的数量

数学:f(0)= 1,f(1)= 1,f(n)= f(n-1)+ k * f(n-2)。

<强>代码:

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))

注意:

  • 此代码从0开始:因此第5个月是n = 4,依此类推。

  • 警告:这个序列随着k越大越快(因此计算fibnum(100,100)可能需要一段时间)。建议记忆化为增加n。

  • 提供显着的加速

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