почему ошибка «функция не определена» в рекурсивном случае? - PullRequest
1 голос
/ 19 июня 2019

Я хочу решить обратную целочисленную задачу .

Вот моя рекурсивная функция, почему Python3 жалуется, что моя функция не определена? есть мысли?

class Solution:
    def reverse(self, x: int) -> int:
        if x < 0:
            return -1 * reverse(self, x)
        if x // 10 == 0:
            return x
        if x % 10 == 0:
            return reverse(self, x // 10)
        else:
            return (x % 10) * 10 ** (len(str(x//10))) + reverse(self, x // 10)

Я просто следую традиционной рекурсивной функции.

Ответы [ 4 ]

1 голос
/ 19 июня 2019

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

class Solution:
def reverse(self, x: int) -> int:
    if x < 0:
        return -1 * self.reverse(x)
    if x // 10 == 0:
        return x
    if x % 10 == 0:
        return self.reverse(x // 10)
    else:
        return (x % 10) * 10 ** (len(str(x//10))) + self.reverse(x // 10)

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

class Solution:
    def reverse(self, x: int) -> int:
        x = str(x)
        x = x[::-1]
        x = int(x)
        return x
1 голос
/ 19 июня 2019

Ваш reverse() - это метод внутри класса, и поэтому он не доступен, просто сказав reverse в коде.Вам также не нужно вводить себя в метод, когда вы его вызываете.

В ответе ShadowRanger даны инструкции, как его исправить.

Этот ответ должен дать вам более подробное представление оРазница между несвязанными и связанными методами: https://stackoverflow.com/a/11950080/8557739

Я также рекомендую пройти базовый урок для классов Python.

1 голос
/ 19 июня 2019

Ваша функция должна выглядеть так:

class Solution:
    def reverse(self, x: int) -> int:
        if x < 0:
            return -1 * self.reverse(x)
        if x // 10 == 0:
            return x
        if x % 10 == 0:
            return self.reverse(x//10)
        else:
            return (x % 10) * 10 ** (len(str(x//10))) + self.reverse(x//10)
1 голос
/ 19 июня 2019

Методы должны вызываться рекурсивно через self;область видимости класса / экземпляра доступна только явно через self (или само имя класса), а не неявно через вложенную область видимости.Измените все варианты использования reverse(self, ...) на self.reverse(...), и это будет работать.

Вы могли бы делать Solution.reverse(self, ...), но это без необходимости повторять имя класса снова и снова, и это будетв любом случае будьте медленнее, чем просто звоните self.reverse напрямую.

...