Python Ошибка рекурсии: RecursionError: максимальная глубина рекурсии превышена при вызове объекта Python - PullRequest
2 голосов
/ 13 марта 2020

Я пытаюсь построить функцию, которая будет принимать число, а затем использовать рекурсию, чтобы распечатать последовательность Фибоначчи и завершить последовательность на числе. Поэтому, если у меня есть последовательность, которая начинается с 0 и 1, если пользовательский ввод 4, он вернет 0, 1, 1, 2, 3. Я получаю это RecursionError:

RecursionError: maximum recursion depth exceeded while calling a Python object

Это мой код:

num = input("Give me a number.")
def fib(n):
  n = int(n)
  if n == 0:
    return 1
  return fib(n - 1) + fib(n - 2)
print(fib(num))

Ответы [ 3 ]

1 голос
/ 13 марта 2020

Второй вызов fib - проблема. Вы проходите базовый случай (условие выхода) и продолжаете рекурсию без конца. Это приводит к ошибке рекурсии.

# to fix, replace "if n == 0:" with:

if n == 0 or n == 1:
0 голосов
/ 13 марта 2020

Ошибка произошла из-за того, что вы используете неправильное правило для Фибоначчи ... Правило говорит, что начальные числа равны 1 и 2, но вы написали свой код, начиная с 0. Измените код:

num = input("Give me a number.")
def fib(num):
    n = int(num)
    if n == 1 or n == 2: # Changed here
        return 1
    return fib(n - 1) + fib(n - 2)

print(fib(num))
0 голосов
/ 13 марта 2020

Две проблемы

Есть две проблемы с вашим кодом:

  • Существует бесконечное l oop, которое генерирует исключение RecursionError
  • Невозможно получить все члены последовательности (вы сказали, что хотите напечатать всю последовательность, а не только последний член)

Бесконечный l oop

Попробуйте код ниже. Я просто добавил n==1 в качестве другого условия остановки.

def fib(n):
    n = int(n)
    if n == 0 or n == 1:  # Changed here
        return 1
    return fib(n - 1) + fib(n - 2)

num = input("Give me a number: ")

print(fib(num))

Случай f(1)=1 требуется по определению (см. здесь ).
Или просто отлаживая свой код, вы поймет, что l oop никогда не закончится для fib(1), потому что возвращает:
f(1-1) + f(1-2) >>> f(0) + f(-1) >>> 1 + infinite loop.

Печать всех терминов

Вы можете попытаться использовать списки в своем рекурсивном коде, что сложно сделать или, возможно, изменить на версию с циклами.

С циклами:

# A version using a while loop
# This code returns the list of terms
def fib(n):

    n=int(n)
    terms = []

    i=0
    while i<=n:
        if i==0 or i==1:
            terms.append(1)
        else:
            terms.append(terms[-2]+terms[-1])
        i+=1

    return terms

Рекурсивно:

Working on it

Попробуйте все эти примеры здесь .

...