Python类中带self的递归函数使用及斐波那契实现问题
类内递归实现斐波那契数列的问题与通用指南
问题场景
我尝试用Python递归求解斐波那契数列,要求代码遵循以下类结构:
class Solution: def fib(self, n: int) -> int: # code here recursively utilizing fib(arg1,arg2)
我的尝试代码:
class Solution: def fib(self, n: int) -> int: if n == 0 : return n if n == 1 or n==2 : return 1 return fib(fib,n-1) + fib(fib,n-2)
运行时出现错误:
NameError: name 'fib' is not defined return fib(fib,n-1) + fib(fib,n-2) Line 7 in fib (Solution.py) ret = Solution().fib(param_1) Line 33 in _driver (Solution.py) _driver() Line 44 in <module> (Solution.py)
我需要一份Python类内递归的通用使用指南,方便后续开发时参考。
问题修复与通用指南
一、先修复你的斐波那契代码
类中的实例方法必须通过self来调用自身,你错误地直接写了fib,Python会将其当作全局函数查找,自然找不到。正确代码如下:
class Solution: def fib(self, n: int) -> int: if n == 0: return 0 if n == 1 or n == 2: return 1 # 通过self调用自身方法实现递归 return self.fib(n-1) + self.fib(n-2)
二、Python类内递归通用指南
1. 实例方法的递归调用
- 类中的实例方法(带
self参数)必须通过self.方法名()来递归调用,因为方法属于当前实例对象,self代表实例本身。 - 错误示例:直接写
方法名(),会触发NameError。 - 正确示例:
self.my_method(参数)
2. 类方法的递归调用
如果是用@classmethod装饰的类方法,需要通过cls参数调用自身(cls代表当前类):
class MyClass: @classmethod def class_method(cls, num): if num <= 0: return 0 return num + cls.class_method(num - 1)
3. 静态方法的递归调用
静态方法(@staticmethod)没有self或cls参数,递归时需要直接写类名+方法名:
class MyClass: @staticmethod def static_method(num): if num <= 0: return 0 return num + MyClass.static_method(num - 1)
4. 必须明确递归终止条件
无论哪种方法,递归必须设置终止条件,否则会无限调用自身,最终引发RecursionError(栈溢出)。比如斐波那契数列中的n==0、n==1就是终止条件。
5. 可选:优化递归性能
对于存在大量重复计算的场景(比如斐波那契),可以用记忆化递归减少重复计算,比如借助lru_cache装饰器:
from functools import lru_cache class Solution: @lru_cache(maxsize=None) def fib(self, n: int) -> int: if n == 0: return 0 if n == 1 or n == 2: return 1 return self.fib(n-1) + self.fib(n-2)
内容的提问来源于stack exchange,提问作者KNU
相关产品推荐
相关产品推荐

