Функция Python, возвращающая данные нулевого типа - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь вычислить n-й Фибоначчи% m для заданных значений.(Используя серию писано).Вот сообщение, которое отображает терминал.

сообщение об ошибке ->

 100 2
    Traceback (most recent call last):
      File "fibag.py", line 27, in <module>
        print(huge_fibo(n,m))
      File "fibag.py", line 21, in huge_fibo
        return get_fibo(rem) % m
    TypeError: unsupported operand type(s) for %: 'NoneType' and 'int'



#uses python3
def pisano_len(m):
    prev=0
    next=1
    for i in range(m*m+1):
        prev,next=next,(prev+next)%m
        if(prev==0 and next==1):
            return i+1
def get_fibo(n):
    if(n<1):
        return n
    prev=0
    curr=1
    for i in range(n-1):
        (prev,curr)=(curr,prev+curr)
        return curr

def huge_fibo(n,m):
    rem=int(n%pisano_len(m))
    return get_fibo(rem) % m

if(__name__=='__main__'):


    n,m=map(int,input().split())
    print(huge_fibo(n,m))

Не могу выяснить причину.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

Ваша get_fibo() функция не выполняет оператор возврата, если n == 1, фактически возвращает None.

2 голосов
/ 19 сентября 2019

Этот бит странный:

for i in range(n-1):
    (prev,curr)=(curr,prev+curr)
    return curr

Цикл выполняется 0 или более раз, в зависимости от значения n.Если он равен 1 или меньше, он запускается 0 раз, если он равен 2, он запускается один раз, как правило, он запускается n-1 раз.

Но функция может возвращать только один раз. Таким образом, даже если n равно 1000, функция вернется сразу же при первом запуске цикла, а остальная часть цикла никогда не произойдет.

И если он выполняется 0 раз (n <= 1), нетreturn в цикле, и функция достигает конца своего кода, так что она возвращает None. </p>

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