Skip to main content
 首页 » 编程设计

python之如何将递归应用于算法

2025年05月04日20oomusou

我正在尝试编写一个捕食者-猎物模型,我在其中输入兔子、狐狸和年份的数量。然后输出该年数后兔子和狐狸的最终数量。我能够返回一定数量的兔子和狐狸,但我没有得到正确的值。一年后狐狸和兔子的算法是:

F1yr = F0yr – Floor(F0yr * (G-S * R0yr))

R1yr = R0yr + Floor( R0yr * (A-B * F0yr))

Where A = 0.04, B = 0.0005, G = 0.2, and S=0.00005

对于 99 年后 5891 只兔子和 16 只狐狸的起始输入,它应该返回 6484 只兔子和 144 只狐狸,但我得到的是 4682 只兔子和 189 只狐狸。

这是我目前的代码,我觉得我接近答案了,但还不完全:

def bunnies(rabbits,foxes,years): 
    if __name__ == '__main__': 
        if years == 0: 
            tot = [] 
            tot.append(rabbits) 
            tot.append(foxes) 
            return tot 
        else: 
            a = 0.04 
            b = 0.0005 
            g = 0.2 
            s = 0.00005 
            rabbits = rabbits + math.floor(rabbits * (a-b * foxes)) 
            foxes = foxes - math.floor(foxes * (g-s * rabbits)) 
            return bunnies(rabbits,foxes,years-1) 
 
rabbits = int(input('Enter Initial Rabbit Population:\n')) 
foxes = int(input('Enter Initial Fox Population:\n')) 
years = int(input('Enter Number of Years to Simulate:\n')) 
 
print(bunnies(rabbits,foxes,years)) 

请您参考如下方法:

您的代码几乎是正确的,这是一个修复和清理过的版本:

import math 
 
 
def bunnies(rabbits, foxes, years): 
    A = 0.04 
    B = 0.0005 
    G = 0.2 
    S = 0.00005 
    if years == 0: 
        return rabbits, foxes 
    else: 
        rabbits_last, foxes_last = rabbits, foxes 
 
        foxes = foxes_last - math.floor(foxes_last * (G - S * rabbits_last)) 
        rabbits = rabbits_last + math.floor(rabbits_last * (A - B * foxes_last)) 
 
        return bunnies(rabbits, foxes, years - 1) 
 
 
if __name__ == '__main__': 
    rabbits = int(input('Enter Initial Rabbit Population: ')) 
    foxes = int(input('Enter Initial Fox Population: ')) 
    years = int(input('Enter Number of Years to Simulate: ')) 
    print(bunnies(rabbits, foxes, years)) 

当您将已经更改的兔子数量值用于新的狐狸数量时,会出现此问题。

您在调用 print(bunnies(rab,fox,yrs)) 时也使用了错误的变量名,但我认为这只是一个复制错误,因为您没有收到错误消息。

最后,你的 if __name__ == '__main__' 不应该在函数内部,而是像我一样在模块范围内。