我需要找出数字中第一个的次数。 这就是我所拥有的:
样本输入:11001
期望的输出:3
def oneCount(n):
n = str(n)
if n == '1':
return 1
else:
return 1 + oneCount(n[:-1])
print oneCount(1100)
现在它返回的数字量而不是1的数量。
答案 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)