ошибка Traceback в python

Мой код:

def f(n):

    if n == 1:
        return 1
    if n == 2:
        return 2
    elif n > 2 and n % 2 != 0:
        return 7 * n + f(n - 3) / 9
    elif n > 1 and n % 2 == 0:
        return 5 * n + f(n - 1) + f(n - 2) / 9

print(f(50))

при выполнении программы выдает ошибку:

Traceback (most recent call last):
  File "<input>", line 12, in <module>
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
  File "<input>", line 10, in f
  File "<input>", line 10, in f
  File "<input>", line 8, in f
TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'

В чем проблема?


Ответы (1 шт):

Автор решения: n1tr0xs

А что будет, если вызвать f(0). Функция вернет None и тогда в рекурсии происходит вот что: None/9. Вам нужно определить поведение функции при входящем n меньше единицы, например так:

def f(n):
    if n < 1:
        return 0
    if n == 1:
        return 1
    if n == 2:
        return 2
    elif n > 2 and n % 2 != 0:
        return 7 * n + f(n - 3) / 9
    elif n > 1 and n % 2 == 0:
        return 5 * n + f(n - 1) + f(n - 2) / 9

print(f(50))

Так же непонятно для чего вам elif. Так же для чего вот эти сравнения (n > 2, n > 1, если код туда и так не должен дойти при невыполнении этих условий.

def f(n):
    if n < 1:
        return 0
    if n == 1:
        return 1
    if n == 2:
        return 2
    if n % 2 != 0:
        return 7 * n + f(n - 3) / 9
    if n % 2 == 0:
        return 5 * n + f(n - 1) + f(n - 2) / 9

print(f(50))

И рубрика, ставшая для меня любимой:

def f(n):
    return 0 if n<1 else 1 if n==1 else 2 if n==2 else 7*n+f(n-3)/9 if n%2 else 5*n+f(n-1)+f(n-2)/9

Или так:

def f(n):
    return 0 if n<1 else n if n in (1, 2) else 7*n+f(n-3)/9 if n%2 else 5*n+f(n-1)+f(n-2)/9

UPD:
Если вкратце, то функция, в которой не выполнился ни один return, делает его "сама" - return None. Для простоты представляете функции в своей голове так:

def f(x):
    # ваш код с ветвлениями, циклами и еще, бог весь чем
    return None # функция "сама добавляет" эту строку в конец себя.
→ Ссылка