面向对象Python中的递归函数调用

3 投票
2 回答
6883 浏览
提问于 2025-04-16 17:10

最近我开始用Python做面向对象编程,针对一个具体的问题,我需要写一个处理分数的类。写一些常见的数学运算方法,比如减法和加法,感觉都还不错;不过我在写一个递归方法的时候遇到了困难。

class fractions():
    def __init__(self, numerator, denominator):
        self.numerator = numerator
        self.denominator = denominator
    def GreatestCommonDivisor(self, numerator, denominator): # This is the culprit
        if numerator%denominator == 0:
            return denominator
        else:
            return GreatestCommonDivisor(self, denominator, numerator%denominator)

当我在另一个需要找到分子最大公约数的方法中调用最大公约数函数时,我得到了:

Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 3.2\src\debug\tserver\_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "C:\Program Files (x86)\Wing IDE 101 3.2\src\debug\tserver\_sandbox.py", line 9, in GreatestCommonDivisor
NameError: global name 'GreatestCommonDivisor' is not defined 

我这样调用这个函数:

X = fractions(9, 36)
X.GreatestCommonDivisor(X.numerator, X.denominator)

如果有人能告诉我这里的问题是什么,以及怎么解决,我会非常感激,因为这是我第一次在类中使用递归函数。

2 个回答

2

最大公约数是一个实例方法,而不是全局方法。你需要这样做:

return self.GreatestCommonDivisor(denominator, numerator%denominator)

不过你的代码看起来显示你还没有完全掌握面向对象的概念。

11

这个地方就是出现NameError的地方:

return GreatestCommonDivisor(self, denominator, numerator%denominator)

应该改成这样:

return self.GreatestCommonDivisor(denominator, numerator % denominator)

撰写回答