一个返回int的递归函数

时间:2016-10-31 06:44:27

标签: python recursion

def nested_count(l : 'any nested list of int', a : int) -> int:
    c = 0
    while len(l) != 0:
        for x in l:
            if type(x) == int:
                if x == a:
                    c = c + 1
                    l.remove(x)
                    nested_count(l,a)
                else:
                    continue 
            elif type(x) == list:
                nested_count(x,a)
    return c

这个函数传递了一个嵌套的int列表和一个int作为参数;它返回单个int参数出现在嵌套列表参数中的次数,例如:

nested_count( [[1,2,[4,[1],8],[1,3,2]],[1,1]], 1 )

返回5

我不确定为什么我的功能不起作用

有人能告诉我如何解决它吗?非常感谢。

5 个答案:

答案 0 :(得分:1)

不使用嵌套函数调用的结果。您可能应该分别用<table id="addProducts" border="1"> <tr> <td>POI</td> <td>Quantity</td> <td>Price</td> <td>Product</td> <td>Add Rows?</td> </tr> <tr> <td>1</td> <td><input size=25 type="text" id="lngbox" readonly=true/></td> <td><input size=25 type="text" class="price" readonly=true/></td> <td> <select name="selRow0" class="products"> <option value="500">Product 1</option> <option value="200">Product 2</option> <option value="450">Product 3</option> </select> </td> <td><input type="button" class="delProduct" value="Delete" /></td> <td><input type="button" class="addProduct" value="AddMore" /></td> </tr> </table> <div id="shw"></div>c += nested_count(l,a)替换这些行。

答案 1 :(得分:0)

您没有将nested_count结果添加到c

def nested_count(lst, l):
    c = 0
    for i in lst:
        if i == l:
            c += 1
        elif type(i) == list:
            c += nested_count(i, l)
    return c

最好用for。迭代列表。

答案 2 :(得分:0)

在迭代它时你不应该改变列表,你需要从递归调用返回结果。您可以通过检查l的类型以及它是否int然后返回bool告诉它是否与a匹配来大大简化功能。如果l是一个列表,只需在其{&#39;}上递归调用nested_count。项目和sum结果:

def nested_count(l, a):
    # Base case
    if type(l) == int:
        return l == a
    return sum(nested_count(x, a) for x in l)

答案 3 :(得分:0)

为什么异类列表?如果您不打算输入所有参数,为什么还要打字呢?你为什么要改变输入?

from typing import List

def deep_count_elem (x:int, xs:List) -> int:
  # done
  if len(xs) == 0:
    return 0
  # if list, count in this list and recurse
  elif isinstance(xs[0], list):
    return deep_count_elem(x, xs[0]) + deep_count_elem(x, xs[1:])
  # if element matches, add 1
  elif x == xs[0]:
    return 1 + deep_count_elem(x, xs[1:])
  # otherwise add nothing, move to next element
  else:
    return deep_count_elem(x, xs[1:])

print(deep_count_elem(1, [[1,2,[4,[1],8],[1,3,2]],[1,1]])) # 5

答案 4 :(得分:0)

正如其他人所提到的,您需要累积nested_count的递归调用的返回值以获得正确的总数。

此外,从您正在迭代的列表(或其他集合)中删除项目可能会导致意外结果,请参阅SO Python常见问题Removing items from a list while iterating over the list以获取详细信息和一些相关的SO页面,特别是:Removing from a list while iterating over it

通常首选call isinstance rather than type进行类型测试。 isinstance函数可以在一次调用中测试多种类型,如果该对象是指定类型的子类,它也将返回True。

以下是一些处理列表或元组的单行代码。

def nested_count(l, a):
    return sum(nested_count(x, a) if isinstance(x, (list, tuple)) else x == a for x in l)

def nested_count(l, a):
    return l.count(a) + sum(nested_count(x, a) for x in l if isinstance(x, (list, tuple)))