Рекурсивная функция Python возвращает результат для одного ввода, но None для другого - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь вычислить ?? по модулю fib (Фибоначчи по модулю m), используя эти две функции. Первый вход возвращает результат, тогда как второй ввод возвращает Нет . Я действительно не понимаю, что с этим не так:

def get_period(n,m):
    # calculate period of m using fibonacci series
    modular_list=[]
    for idx,element in enumerate(fib_series(n)[0]):
        modular_list.append(element%m)
        for i in range(len(modular_list)-1):
            if modular_list[i]==0 and modular_list[i+1]==1:
                if i>1:
                    period = idx-1
                    modular_list_period = modular_list[:-2]
                    return(period, modular_list_period)
                else:
                    continue

def fib_series(n):
    lst = [0,1]
    for i in range(n):
        if n>=1:
            lst.append(lst[-1]+lst[-2])
        else:
            return 0
    return lst[:-1], lst[-2]

print(get_period(2015,3)) # returns -> (8, [0, 1, 1, 2, 0, 2, 2, 1])
print(get_period(239,1000)) # returns -> None

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Используя ваш код, а также в соответствии с диаграммой на этой странице , период равен 1500. Вы получаете None, поскольку вы не установили n достаточно высоко. Замените 239 на целое число больше 1500, и вы увидите желаемый результат (который слишком объемен для вставки).

Попробуйте, например,

print(get_period(2390,1000))

вместо.

0 голосов
/ 30 июня 2018

print (get_period (100,44)) # вы должны передать меньшее значение для m, print (get_period (239,90)) # примерно так, значение m должно быть меньше n.

0 голосов
/ 30 июня 2018

В вашем коде есть логическая ошибка. Ваша get_period функция завершает свое выполнение, не возвращая никакого значения для второго ввода. Вот почему его возвращаемое значение печати по умолчанию None. Посмотрите на этот обновленный код:

def get_period(n,m):
    # calculate period of m using fibonacci series
    modular_list=[]
    for idx,element in enumerate(fib_series(n)[0]):
        modular_list.append(element%m)
        for i in range(len(modular_list)-1):
            if modular_list[i]==0 and modular_list[i+1]==1:
                if i>1:
                    period = idx-1
                    modular_list_period = modular_list[:-2]
                    return(period, modular_list_period) #for the second command this return is not getting executed,try to check value of i and len(modular_list)
                else:
                    continue
    return  modular_list  #updated return statement. previous loop doesn't returns the value the return from here
def fib_series(n):
    lst = [0,1]
    for i in range(n):
        if n>=1:
            lst.append(lst[-1]+lst[-2])
        else:
            return 0

    return lst[:-1], lst[-2]

print(get_period(2015,3)) # returns -> (8, [0, 1, 1, 2, 0, 2, 2, 1])
print(get_period(239,1000))
...