【发布时间】:2019-09-14 04:43:59
【问题描述】:
我正在编写一个在初始化时接受整数输入列表的类。该类有一堆排序方法。我想添加一个装饰器,它会在每次方法调用之前对输入列表进行洗牌。尝试实现递归冒泡排序时,装饰器导致RecursionError: maximum recursion depth exceeded in comparison
我尝试传递 self 参数,以便装饰器可以访问类变量。但是我需要关于如何让递归函数与装饰器一起工作的帮助
import functools
from searching import timer
import random
def shuffle(func):
@functools.wraps(func)
def wrapper(self, *args, **kwargs):
random.shuffle(self.ip_list)
value = func(self, *args, **kwargs)
return value
return wrapper
class sorting:
def __init__(self, ip_list):
self.ip_list = ip_list
self.n = len(self.ip_list)
self.timer_dict = {}
@shuffle
@timer
def recursive_bubble_sort(self):
print(self.ip_list)
for j in range(self.n):
try:
if self.ip_list[j] > self.ip_list[j+1]:
self.ip_list[j], self.ip_list[j + 1] = self.ip_list[j + 1], self.ip_list[j]
self.recursive_bubble_sort()
except IndexError:
pass
print(self.ip_list)
x = [i for i in range(0,30)]
s = sorting(x)
s.recursive_bubble_sort()
【问题讨论】:
-
你为什么要为此使用装饰器,为什么要使用冒泡排序是我的第二个问题?
-
只是学习它们并试图帮助提高自己
-
我会研究学习归并排序。冒泡排序经常被教授,因为它很容易实现但效率极低(O(n ^ 2),我不确定他们为什么要教授它)。话虽如此,我会看看我是否可以调试它。
-
如果不传递任何内容,您的排序将无法工作。递归函数通过将子集传递给递归调用来工作。您正在尝试全部到位,这会导致逻辑问题。
-
是的,我正在创建一个包含所有排序方法的类,所以让合并排序可能是我在这个类中的下一个方法,我希望装饰器在方法之前对类变量
self.ip_list进行洗牌被执行
标签: python recursion decorator