Python如何将递归应用于算法

时间:2019-03-07 23:46:16

标签: python python-3.x recursion

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

  

F1yr = F0yr –下限(F0yr *(G-S * R0yr))

     

R1yr = R0yr +底数(R0yr *(A-B * F0yr))

     

其中A = 0.04,B = 0.0005,G = 0.2和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))

1 个答案:

答案 0 :(得分:5)

您的代码几乎正确,这是一个已修复的固定版本:

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__'不应位于函数内部,而应像我一样位于模块范围内。