类内递归函数简化咨询:Boy类中独立递归函数调用优化
类内递归函数简化为单条语句调用的解决方案
嘿,这个坑我太熟了!把原本好好的独立递归函数移到类里就报错,本质上是没搞清楚类方法的上下文绑定——在类内部,递归调用必须明确指向当前实例(或类)的方法,不能像全局函数那样直接调用。
先给你看个典型的错误写法,就是把全局递归直接搬进来的情况:
# 原来正常工作的独立递归函数 def factorial(n): return 1 if n <= 1 else n * factorial(n-1) # 移到类里后报错的版本 class Boy: def factorial(self, n): # 这里会报NameError:找不到factorial,因为它现在是实例方法,不是全局函数 return 1 if n <= 1 else n * factorial(n-1)
要把它改成单条语句的正确写法其实很简单,只需要在递归调用前加上self.,明确告诉解释器要调用当前实例的factorial方法就行:
class Boy: def factorial(self, n): # 这就是单条语句的递归实现,和原来的逻辑完全一致 return 1 if n <= 1 else n * self.factorial(n - 1)
如果你的递归函数是类方法(用@classmethod装饰的),那只需要把self换成cls就行,同样是单条语句:
class Boy: @classmethod def factorial(cls, n): return 1 if n <= 1 else n * cls.factorial(n - 1)
核心逻辑就是:类内部的方法不属于全局作用域,递归时必须通过实例(self)或类(cls)来引用,这样解释器才能找到正确的方法。加上这个前缀后,你完全可以把递归写成和独立函数一样简洁的单条三元表达式语句,不需要任何复杂的“特定写法”。
内容的提问来源于stack exchange,提问作者Hasan A Yousef
相关产品推荐
相关产品推荐

