使用递归计算列表中数字的出现次数

时间:2014-07-11 17:02:56

标签: python recursion

我正在做的任务是:

  

给定一个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"没有柜台的阵列!!

所以这件事可以接受吗?你会以同样的方式做到吗?

提前致谢

3 个答案:

答案 0 :(得分:5)

您通常返回总计数:

def array11(arr, index):
    if index == len(arr):
        return 0
    return (arr[index] == 11) + array11(arr, index + 1)

我在这里使用一个小Python技巧,其中boolint的子类,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中讨论递归,因此假设性能不是一个因素。