为什么在递归情况下出现“未定义函数”错误?

时间:2019-06-19 03:21:49

标签: python python-3.x function recursion reverse

我想解决一个反向integer problem

这是我的递归函数,为什么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 个答案:

答案 0 :(得分:1)

方法需要通过self进行递归调用;类/实例的范围只能通过self(或类名本身)来显式访问,而不能通过嵌套范围来隐式访问。将reverse(self, ...)的所有用法更改为self.reverse(...),它将起作用。

可以Solution.reverse(self, ...),但这无须一遍又一遍地重复类名,这比直接直接调用self.reverse要慢。

答案 1 :(得分:1)

您的reverse()是类中的一种方法,因此仅在代码中说reverse便无法实现。您也无需在调用该方法时将其提供给自身。

ShadowRanger的回答给出了如何修复它的说明。

此答案应该使您更深入地了解未绑定方法和绑定方法之间的区别:https://stackoverflow.com/a/11950080/8557739

我还建议您阅读一些有关python类的基本教程。

答案 2 :(得分:1)

您的函数应如下所示:

some logic1

答案 3 :(得分:1)

您应该使用self调用反向方法。还有一个错误是您也将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