Рекурсивный вызов функции в ООП Python - PullRequest
2 голосов
/ 07 мая 2011

Итак, я недавно начал заниматься объектно-ориентированным программированием на 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)

Когда я вызываю функцию Greatest Common Divisor в другом методе, который нуждается в поиске наибольшего делителя числителя, я получаю:

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 ]

7 голосов
/ 07 мая 2011

В этой строке происходит ошибка NameEr *:

return GreatestCommonDivisor(self, denominator, numerator%denominator)

Она должна выглядеть так:

return self.GreatestCommonDivisor(denominator, numerator % denominator)
2 голосов
/ 07 мая 2011

GreatestCommonDivisor - это метод экземпляра, а не глобальный метод.Вам нужно сделать

return self.GreatestCommonDivisor(denominator, numerator%denominator)

Но ваш код, кажется, показывает, что вы еще не полностью поняли объектно-ориентированные концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...