在python中计算递归算法中的操作数
我正在python中实现二分法搜索算法,在函数的第二个版本中,我必须(除了根据元素的存在与否返回true或false之外)根据我使用的列表的长度计算算法执行的操作(比较)的数量并返回它 然而,我的函数是递归的,自然我必须将一个计数器变量初始化为零(在每次操作中都会递增)。问题是这个变量在每次递归调用时都会取零值,因此,它不会给我正确的值。我想到了一个全局变量,但我不知道如何使用它 以下是我的函数代码:在python中计算递归算法中的操作数,python,algorithm,recursion,Python,Algorithm,Recursion,我正在python中实现二分法搜索算法,在函数的第二个版本中,我必须(除了根据元素的存在与否返回true或false之外)根据我使用的列表的长度计算算法执行的操作(比较)的数量并返回它 然而,我的函数是递归的,自然我必须将一个计数器变量初始化为零(在每次操作中都会递增)。问题是这个变量在每次递归调用时都会取零值,因此,它不会给我正确的值。我想到了一个全局变量,但我不知道如何使用它 以下是我的函数代码: def trouve(T, x) : if len(T) == 0 :
def trouve(T, x) :
if len(T) == 0 :
return False
mid = len(T) // 2
if T[mid] == x :
return True
if len(T) == 1 and T[0] != x :
return False
else :
if x > T[mid] :
return trouve(T[mid:], x)
else :
return trouve(T[:mid], x)
通常,您只计算数据的比较,而不计算比较输入列表长度的条件 您可以使用第三个参数累积计数,然后让函数返回success和count的元组:
def trouve(T, x, c = 0):
if len(T) == 0:
return (False, c) # len() comparisons do not count
mid = len(T) // 2
if T[mid] == x:
return (True, c+1)
if len(T) == 1: # you don't need to compare x again here!
return (False, c+1)
# you don't need `else` here
if x > T[mid]:
return trouve(T[mid:], x, c+2)
# you don't need `else` here
return trouve(T[:mid], x, c+2)
print (trouve([1,3,8,13,14,15,20], 14))
请注意,您可以稍微优化一下:
def trouve(T, x, c = 0):
if len(T) == 0:
return (False, c)
mid = len(T) // 2
# you don't need the `len(T) == 1` case, as it can be
# treated in the recursive call. See change below:
if x > T[mid]:
return trouve(T[mid+1:], x, c+1) # exclude mid itself
# Move equality test below greater-then test, since the
# equality has little chance of being true:
if T[mid] == x:
return (True, c+2)
return trouve(T[:mid], x, c+2)
print (trouve([1,3,8,13,14,15,20], 14))
。。。尽管对于我给出的示例,计数在这个版本中仍然是相同的。如果您想使用全局变量路径(因为您提到了它),您将这样做
trouve_count = 0
def trouve(T, x) :
global trouve_count
# Increment trouve_count like this when necessary:
trouve_count += 1
# ...
在较大的程序中使用这些名称时要小心,因为您可能会意外地使用相同的全局名称两次,从而导致问题。唯一可以算作比较的操作是
x>T[mid]
?什么是-根据您的比较?操作数和==为什么不定义一个(gasp)并增加它?您也可以尝试@bytesized ahh是的,您是正确的。我修改了我的建议,加入了一个链接