Как обобщить для переменной m вместо использования нескольких условных операторов в Python? - PullRequest
0 голосов
/ 15 мая 2018

Это проблема, над которой я работаю: http://rosalind.info/problems/fibd/

Я пытаюсь обобщить переменную m в следующем коде:

def fibonnaciMortalRabbit(n, m):

    #Set up list of of m different generation categories
    rabbits = [0 for x in range(m)]
    #Initate first rabbit pair
    rabbits[0] = 1

    #n - 1 to calculate right generation
    for i in range(n - 1):

        if m == 2:
            rabbits[0], rabbits[1] = rabbits[1], rabbits[0]
        elif m == 3:
            rabbits[0], rabbits[1], rabbits[2] = rabbits[1] + rabbits[2], rabbits[0], rabbits[1]
        elif m == 4:
            rabbits[0], rabbits[1], rabbits[2], rabbits[3] = rabbits[1] + rabbits[2] + rabbits[3], rabbits[0], rabbits[1], rabbits[2]
        elif m == 5:
            rabbits[0], rabbits[1], rabbits[2], rabbits[3], rabbits[4] = rabbits[1] + rabbits[2] + rabbits[3] + rabbits[4], rabbits[0], rabbits[1], rabbits[2], rabbits[3] 
    return sum(rabbits)


print(fibonnaciMortalRabbit(8, 2))

Есть ли способсделать обобщение для условных операторов, используя переменную m в цикле?

Я уверен, что есть лучший способ решить эту проблему, однако то, что я сделал до сих пор, работает хорошо для случаев, когда у меня естьусловное утверждение для m.

Текущая проблема, над которой я работаю, состоит в том, что m < 20, поэтому я не пишу почти 20 различных утверждений elif.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Ты имеешь в виду что-то подобное?

from collections import deque

def fibonnaciMortalRabbit(n, m):
    rabbits = deque([0, 1, 1, 1], maxlen=m+1)

    for _ in range(2, n):
        rabbits.append(rabbits[-1] + rabbits[-2] - rabbits[0])
    return rabbits[-1]

In []:
fibonnaciMortalRabbit(6, 3)

Out[]
4

In []:
fibonnaciMortalRabbit(100, 20)

Out[]
353368918335207375428

Вдохновленный ответом в комментариях:

def fibMR(n, m):
    rabbits = deque([0, 1], maxlen=m)

    for i in range(n-1):
        rabbits.append(sum(rabbits)-rabbits[-1])
    return sum(rabbits)

In []:
fibMR(6, 3)

Out[]:
4

In []:
fibMR(100, 20)

Out[]:
353368918335207375428

Просто сравнение по времени:

%timeit fibonnaciMortalRabbit(1000, 20)
259 µs ± 8.17 µs per loop

%timeit fibMR(1000, 20)
1.13 ms ± 18.5 µs per loop

Просто для сравнения ответ в комментариях:

%timeit fib(1000, 20)
1.35 ms ± 17.2 µs per loop
0 голосов
/ 15 мая 2018

Я думаю, это то, что вы ищете, исходя из условий, которые у вас есть (однако, я думаю, что вы пропустили набранное для m == 5):

for i in range(n - 1):
    tmp = sum(rabbits[1:])
    for j in range(m - 1):
        rabbits[j + 1] = rabbits[j]

    rabbits[0] = tmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...