Что не так с моей рекурсивной функцией гипероперации python?

#python #recursion #math

#python #рекурсия #математика

Вопрос:

Я попытался использовать определение из Википедии для гиперопераций и перевести его в код Python. Моя цель состояла в том, чтобы сделать ее читаемой, сделать ее быстрой было задачей на потом. Вот определение, которое я использовал, а ниже — мой код. введите описание изображения здесь

из Википедии: https://en.wikipedia.org/wiki/Hyperoperation#Definition

А теперь вот мой код:

 def hyperation(n, a, b):
    if n == 0:
        return b 1
    if n == 1 and b == 0:
        return a
    if n == 2 and b == 0:
        return 0
    if n >= 3 and b == 0:
        return 1
    return hyperation(n-1, a, hyperation(n, a, b-1))
  

Когда я попробовал это с гиперацией (n = 1, a = 3, b = 3), что в принципе должно быть таким же, как
3 3
Я всегда достигаю предела рекурсии, независимо от того, насколько высоко я его установил.

Когда вы пытаетесь сделать это на бумаге вручную, это работает отлично. И во время отладки я не мог понять, что происходит. Спасибо за любую помощь!!!

Комментарии:

1. Я бы сказал, что это ошибка где-то в другом месте. Я копирую вашу функцию и выполняю ее с помощью print(hyperation(1,3,3)), и это работает

2. Пожалуйста, не редактируйте свой вопрос таким образом, чтобы сделать недействительными существующие ответы. Вместо этого вы можете задать новый вопрос для новой проблемы.

Ответ №1:

В вашей последней строке return отсутствует ключевое слово.

Комментарии:

1. Вау, спасибо. Хотя вы правы, и это была ошибка, она все еще не работает. Спасибо за вашу помощь.

Ответ №2:

Во-первых, ваш код был неправильно отформатирован, потому что python — язык, чувствительный к отступам.

Во-вторых, последняя строка журнала ошибок указывает, что ошибка заключается в добавлении NoneType и int . Вы ничего не вернули в последнем else блоке, так что это вернет NoneType . Просто добавьте return в начале последнего предложения.

В-третьих, вы можете удалить все elif после return и просто использовать if .

Комментарии:

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