我正在做的任务是:
给定一个int数组,递归计算值11出现在数组中的次数。我们将使用仅考虑从给定索引开始的数组部分的约定。通过这种方式,递归调用可以传递index + 1来向下移动数组。
我需要递归地执行此操作。我对此很新,但我在技术上使它成功了。 我有以下内容:
def array11(arr, index, cnt=0, num=0):
if(cnt==len(arr)-index):
print("yay!!! number 11 appears %d times"%num)
return
elif(arr[index:][cnt]==11):
num+=1
cnt+=1
array11(arr,index,cnt,num)
else:
cnt+=1
array11(arr,index,cnt,num)
但是我觉得我通过添加" cnt"以某种原因便宜了。和" num"具有默认值的参数。我只是不知道如何通过" arr"没有柜台的阵列!!
所以这件事可以接受吗?你会以同样的方式做到吗?
提前致谢
答案 0 :(得分:5)
您通常返回总计数:
def array11(arr, index):
if index == len(arr):
return 0
return (arr[index] == 11) + array11(arr, index + 1)
我在这里使用一个小Python技巧,其中bool
是int
的子类,True
等于1.因此,加上布尔(或布尔和整数)结果在布尔值中将被解释为整数。
您可以使用print
然后对array11()
返回的最外层电话进行处理。
答案 1 :(得分:1)
这是完全可以接受的,尽管不是最干净的方式来执行尾递归。您正在使用累加器来调用您的计数来跟踪您的计数,这使您可以进行尾递归(更有效的递归类型)。
然而,正如BlackVegetable指出的那样,Python不允许你获得尾递归的好处,但是理解使用累加器与自顶向下方法之间的区别绝对值得注意,如Martijn Pieter的回答。
答案 2 :(得分:0)
在Python 3中,它可以像这样简洁:
arr = [11, 0, 4, 7, 2, 11, 6, 11, 12]
def count11(arr):
if not arr:
return 0
first, *rest = arr
return (1 if first == 11 else 0) + count11(rest)
count11(arr) # 3
列表切片可能效率不高,但由于我们在Python中讨论递归,因此假设性能不是一个因素。