OOP Python中的递归函数调用

时间:2011-05-07 02:06:32

标签: python oop recursion

所以我最近开始用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 个答案:

答案 0 :(得分:7)

这一行是NameError发生的地方:

return GreatestCommonDivisor(self, denominator, numerator%denominator)

应该是:

return self.GreatestCommonDivisor(denominator, numerator % denominator)

答案 1 :(得分:2)

GreatestCommonDivisor是一个实例方法,而不是全局方法。你需要做

return self.GreatestCommonDivisor(denominator, numerator%denominator)

但是你的代码似乎表明你并没有完全掌握面向对象的概念。