递归函数计算数字中数字的出现(python)

时间:2015-01-25 21:54:45

标签: python function recursion counting

我需要找出数字中第一个的次数。 这就是我所拥有的:

样本输入:11001

期望的输出:3

def oneCount(n):
    n = str(n)
    if n == '1':
        return 1
    else:
        return 1 + oneCount(n[:-1])

print oneCount(1100)

现在它返回的数字量而不是1的数量。

5 个答案:

答案 0 :(得分:4)

def oneCount(n):    
    n = str(n)
    # Here, you check if the entire string is '1'.
    # Not sure if you mean to check if a single digit is '1'.
    if n == '1':
        return 1
    else:
        # If the entire string is not '1', you recur on all but the least significant digit.
        return 1 + oneCount(n[:-1])
print oneCount(1100)

步行:

oneCount(1100) -> '1100' is not '1'. recurs on 1 + oneCount('110')
1 + oneCount('100') -> '110' is not '1'. recurs on 1 + (1 + oneCount('11'))
2 + oneCount('00') -> '11' is not '1'. recurs on 2 + (1 + oneCount('1'))
3 + oneCount('0') -> '1' is '1'. return 1
4
好的,这是一个错误的答案,但也许更加阴险,如果你最重要的数字不是1?

oneCount(2)
>>> RuntimeError: maximum recursion depth exceeded while calling a Python object

你最终会在空字符串上重复出现。空字符串不是' 1'所以递归是无限的!

当重复出现像字符串或列表这样的迭代时,一个好的经验法则是将空迭代视为基本情况。

def oneCount(i):
    i = str(i)
    if i == '':
        return 0
    # Do not recur in the base case, above
    # The below cases are not the base case, so expect to recur
    # What is the nature of the recursion?
    car, cdr = i[0], i[1:] # silly lisp reference
    if car == '1':
        ???
    # else?

只是为了好玩

布尔值为整数

考虑一个布尔值相当于Python中的整数值1或0。您可以将该值添加到整数。

  

return(car == 1)+ oneCount(cdr)

自由基

考虑到您不需要将整数转换为字符串以便迭代它。请考虑cdr, car = divmod(i, 10),或更明显地cdr, car = i // 10, i % 10。有趣的是,您可以计算任何基数中数字的出现次数。

def oneCount(i, base=10):
    if i == 0:
        return 0
    cdr, car = divmod(i, base)
    if car == 1:
        ???
    ???

>>> oneCount(int('111111100000', 2), 2)
7

答案 1 :(得分:1)

一个简单的解决方案:

def oneCount(n):
    n = str(n)
    # if we have reached the end of n return 0
    if not n:
        return 0
    # check current n[0] is == 1 and move right one char in n
    else:
        return (n[0] == "1") + oneCount(n[1:])

答案 2 :(得分:0)

我首先不想回答这个问题,但所有不好的答案都迫使我这么做......

首先,递归作为终端案例和递归案例。终端案例是您可以立即告诉结果的情况。对于您的任务,它是空字符串,因为它包含零:

if n == '':
  return 0

在递归的情况下,你必须检查你的字符串是否以1开头:

if n.startswith('1'):
  return 1+oneCount(n[1:])
else:
  return oneCount(n[1:])

此外,您每次都会将n转换为字符串,这不是必需的。

pythonic解决方案将使用if not n:而不是if n == '':,因此完整的解决方案可能看起来像

def oneCountRecur(n):
  if not n:
    return 0

  if n.startswith('1'):
    return 1 + oneCountRecur(n[1:])
  else:
    return oneCountRecur(n[1:])

def oneCount(n):
  return oneCountRecur(str(n))

else:以上return oneCountRecur(n[1:])可以省略,这是个人品味的问题。

答案 3 :(得分:0)

因为你坚持使用递归解决方案。我们走了

def oneCount(n):
    digits = str(n)
    count = 1 if digits.startswith('1') else 0
    for digit in digits[1:]:  # start looping from next digit
        count += oneCount(digit)
    return count

编辑:如果您不认为上述函数足够递归:

def oneCount(n):
    digits = str(n)
    count = 1 if digits.startswith('1') else 0
    if len(digits) > 1: 
        count += oneCount(digits[1:])
    return count

答案 4 :(得分:0)

def oneCount(n):  
    if not n:  
        return 0  
    else:  
        return (n % 10 == 1) + oneCount(n // 10)