Почему говорится, что я достиг максимальной глубины рекурсии? Как я могу это исправить?

Вопрос или проблема

города = ["Бостон", "Лас-Вегас", "Порто-Алегре", "Кейптаун", "Берлин", "Окинава", "Сидней"]
отели = [255, 450, 150, 250, 650, 675, 850]
рейсы = [950, 3000, 4500, 2750, 2500, 3500, 10500]


def добавить_место(город, отель, рейс):
    global города, рейсы, отели
    print("""Добавьте ваше желаемое место. Пожалуйста, укажите стоимость отеля и рейса,
    а также название вашего желаемого места и отеля.""")
    новый_город = input("Введите ваш новый город: ")
    новая_стоимость_отеля = int(input("Введите стоимость вашего нового отеля за ночь: "))
    новая_стоимость_рейса = int(input("Введите стоимость вашего рейса:"))
    города.append(новый_город)
    отели.append(новая_стоимость_отеля)
    рейсы.append(новая_стоимость_рейса)

    стоимость = [рейсы] + [отели]

def рассчитать_общую_стоимость(отели, рейсы):
    global город, отель, рейс, стоимость
    стоимость_рейса = sum(рейсы)
    стоимость_отеля = sum(отели)
    общая_стоимость = sum({стоимость_отеля, стоимость_рейса})
    результат = рассчитать_общую_стоимость(отели, рейсы)

   
def отобразить_сводку_бюджета(города, отели, рейсы):
    for i in range(len(города)):
        print(f"{города[i]}, ${отели[i]} ${рейсы[i]}.")
    результат = рассчитать_общую_стоимость(отели, рейсы)
    print(f"Ваш текущий бюджет/потраченные деньги составляют ${результат}.")

while True:
    print(f"""В настоящее время города, которые вы планируете посетить во время отпуска: {города}."
    Пожалуйста, выберите вариант, чтобы внести изменения в ваш отпуск.""")
    print("1. Добавить направление")
    print("2. Посмотреть сводку бюджета")
    print("3. Выйти из программы")

    вариант = int(input("Пожалуйста, выберите ответ: "))

    if вариант == 1:
        добавить_место(города, отели, рейсы)

    elif вариант == 2:
        отобразить_сводку_бюджета(города, отели, рейсы)

    elif вариант == 3:
        break

    else:
        print("Пожалуйста, выберите действительный вариант.")

Предоставленный выше код. Когда я запускаю это на Online Python, я получаю сообщение об ошибке, что я достиг максимальной глубины рекурсии, и я не понимаю, что я могу сделать, чтобы исправить это. Насколько я понимаю, большинство проблем касается функции отображения. Может кто-то объяснить, как я могу исправить эту ошибку?

Эта функция является проблемой:

def рассчитать_общую_стоимость(отели, рейсы):
    global город, отель, рейс, стоимость
    стоимость_рейса = sum(рейсы)
    стоимость_отеля = sum(отели)
    общая_стоимость = sum({стоимость_отеля, стоимость_рейса})
    результат = рассчитать_общую_стоимость(отели, рейсы)

Функция вызывает саму себя, что вызывает саму себя, что вызывает саму себя … вечно.

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

Может, вы имели в виду просто return общая_стоимость?

На самом деле, я думаю, что функцию можно сократить до этого:

def рассчитать_общую_стоимость(отели, рейсы):
    return sum(рейсы) + sum(отелей)

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

Ответ или решение

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

Подробный анализ проблемы

Код, вызывающий бесконечную рекурсию

Ваша текущая реализация функции выглядит следующим образом:

def calculate_total_cost(hotels, flights):
    global city, hotel, flight, cost
    f_cost = sum(flights)
    h_cost = sum(hotels)
    t_cost = sum({h_cost, f_cost})
    result = calculate_total_cost(hotels, flights)

Функция вызывает саму себя с теми же параметрами hotels и flights без условий выхода, что приводит к бесконечному циклу вызовов. Python имеет предопределенное значение для максимальной глубины рекурсии (обычно 1000), и при её превышении возникает ошибка.

Исправление кода

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

def calculate_total_cost(hotels, flights):
    return sum(hotels) + sum(flights)

Эта версия просто суммирует все значения списков hotels и flights и возвращает общий итог без вызова себя.

Устранение ненужных глобальных переменных

Также стоит упомянуть об использовании глобальных переменных в вашей функции. В данном случае они не нужны, так как функция самостоятельно принимает необходимые списки в качестве аргументов. Это делает функцию более чистой и легко читаемой.

Обновленный код функции

Вот обновленная версия вашей функции с учетом вышеизложенных замечаний:

def calculate_total_cost(hotels, flights):
    return sum(hotels) + sum(flights)

Дополнительные изменения

Кроме того, вы можете немного улучшить организацию кода, сделав его более понятным. Например, в функции display_budget_summary можно убрать лишние вызовы функций:

def display_budget_summary(cities, hotels, flights):
    for i in range(len(cities)):
        print(f"{cities[i]}, ${hotels[i]} ${flights[i]}.")
    result = calculate_total_cost(hotels, flights)
    print(f"Your current budget/money spent is ${result}.")

Заключение

Исправление функции calculate_total_cost позволит вам избежать проблемы, связанной с переполнением стека вызовов из-за бесконечной рекурсии. Кроме того, оптимизация использования глобальных переменных улучшит читаемость и управляемость вашего кода.

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

Оцените материал
Добавить комментарий

Капча загружается...