Python 使用递归的方法

Python 使用递归的方法,python,recursion,methods,Python,Recursion,Methods,我正在为“时间”类写一个“干净”的方法。clean方法将使用Time对象,并确保秒数和分钟数介于0和59之间。我遇到了一个递归错误。以下是我到目前为止的情况: def clean(self): '''Adjust Time object so that the number of seconds and minutes is between 0 and 59''' if self.S < 60: self.S else:

我正在为“时间”类写一个“干净”的方法。clean方法将使用Time对象,并确保秒数和分钟数介于0和59之间。我遇到了一个递归错误。以下是我到目前为止的情况:

def clean(self):
    '''Adjust Time object so that the number of seconds and minutes
       is between 0 and 59'''

    if self.S < 60:
        self.S
    else:
        self.M = int(self.S/60)+self.M
        self.S = self.S%60


    if self.M < 60:
        self.M
    else:
        self.H = int(self.M/60)+ self.H
        self.M = self.M%60


    if isinstance(self.H,float) == True:
        self.S = self.H * 3600
        self.clean()
    else:
        self.H

        return self.__str__()
def清洁(自清洁):
''调整时间对象,使秒数和分钟数
介于0和59''之间
如果self.S<60:
赛尔夫
其他:
self.M=int(self.S/60)+self.M
self.S=self.S%60
如果self.M<60:
self.M
其他:
self.H=int(self.M/60)+self.H
self.M=self.M%60
如果isinstance(self.H,float)=True:
self.S=self.H*3600
self.clean()
其他:
self.H
返回自我

递归似乎只发生在这里:

if isinstance(self.H,float) == True:
    self.S = self.H * 3600
    self.clean()
如果将
self.H
设置为非
float
,则不会重复:

if isinstance(self.H,float) == True:
    self.S = self.H * 3600
    self.H = int(self.H)    # add this line
    self.clean()
更好的是,调整顶部的值,这样就不需要递归:

# move this to the first lines of your method
if isinstance(self.H,float) == True:
    self.S = self.H * 3600
在代码中:

if isinstance(self.H,float) == True:
    self.S = self.H * 3600
    self.clean()
else:
如果这是真的,那么它将永远是真的。我猜您想设置
self.H=0
或类似的设置(因为您将其全部转换为秒)

此外,在if语句中,使用“self.S”实际上没有任何作用,因此您应该写:

if self.S < 60:
    self.S
else:
    self.M = int(self.S/60)+self.M
    self.S = self.S%60
另外,在递归检查中,您破坏了self.S的先前值,您是想添加它吗

编辑: 您没有在问题中指定,但从代码中可以看出,您假设时间值(S,M,H)是有效的,并且您只是在移动数量,以获得与S<60和M<60相同的总时间。如果是这种情况,则可以通过在开始时将所有内容转换为秒,然后执行S和M步骤,轻松消除递归:

self.S = self.H * 3600 + self.M * 60 + self.S

self.M = int(self.S / 60)
self.H = int(self.M / 60) # or = int(self.S / 3600)

self.M = self.M % 60
self.S = self.S % 60

我相信如果self.S<60:self.S是死代码。对于另一个if语句也是如此。在这种情况下,我也会消除递归,但是如果没有关于数据是什么的更多信息,您可能需要的不仅仅是将小时转换为秒。
self.S = self.H * 3600 + self.M * 60 + self.S

self.M = int(self.S / 60)
self.H = int(self.M / 60) # or = int(self.S / 3600)

self.M = self.M % 60
self.S = self.S % 60