Python:获取对象str时的最大递归深度
我正在制作一个程序来获取数字中的字母数量:Python:获取对象str时的最大递归深度,python,recursion,Python,Recursion,我正在制作一个程序来获取数字中的字母数量: def convert(number): lettercount = 0 numstr = str(number) # One's places if len(numstr) is 1: if number == 1 or number == 2 or number == 6: lettercount += 3 elif number == 4 or numb
def convert(number):
lettercount = 0
numstr = str(number)
# One's places
if len(numstr) is 1:
if number == 1 or number == 2 or number == 6:
lettercount += 3
elif number == 4 or number == 5 or number == 9:
lettercount += 4
else:
lettercount += 5
# Ten's places
elif len(numstr) is 2:
if number == 10:
lettercount += 3
elif number == 11 or number == 12:
lettercount += 6
elif number == 15 or number == 16:
lettercount += 7
elif number == 13 or number == 14 or number == 19:
lettercount += 8
elif number == 17 or number == 18:
lettercount += 9
elif number == 20 or number == 30 or number == 40 or\
number == 80 or number == 90:
lettercount += 6
else:
lettercount += convert(int((numstr)[-1]))
lettercount += convert(int(round(number, -1)))
return lettercount
print "88 has %i letters in its name." % convert(88)
print "23 has %i letters in its name." % convert(23)
print "46 has %i letters in its name." % convert(46)
它工作得很好,对88和23返回正确的响应,但对46给出递归深度错误。我很困惑;为什么它只发生在46岁
固定代码:
def convert(number):
lettercount = 0
numstr = str(number)
# One's places
if len(numstr) == 1:
if number == 1 or number == 2 or number == 6:
lettercount += 3
elif number == 4 or number == 5 or number == 9:
lettercount += 4
else:
lettercount += 5
# Ten's places
elif len(numstr) == 2:
if number == 10:
lettercount += 3
elif number == 40 or number == 50:
lettercount += 5
elif number == 11 or number == 12 or number == 20 or number == 30 or\
number == 80 or number == 90:
lettercount += 6
elif number == 15 or number == 16:
lettercount += 7
elif number == 13 or number == 14 or number == 19:
lettercount += 8
elif number == 17 or number == 18:
lettercount += 9
else:
lettercount += convert(int((numstr)[-1]))
lettercount += convert((int(numstr) // 10) * 10)
return lettercount
print "88 has %i letters in its name." % convert(88)
print "23 has %i letters in its name." % convert(23)
print "46 has %i letters in its name." % convert(46)
因为当你这么做的时候
convert(int(round(number, -1)))
您正在调用
convert(50)
。由于您的if
语句不包含50,因此它再次到达else
,并再次调用convert(50)
,以此类推。这里的问题是round(46,-1)
将生成值50
。当使用值50
调用convert
时,它将转到完全相同的行
lettercount += convert(int(round(number, -1)))
round(50,-1)
调用将产生50
,此时convert
函数将无限执行,因为round(46,-1)
是50
。提示:不要使用len(numstr)是2
,使用len(numstr)==2
因为如果两个对象位于同一个内存点上,则is
仅返回True
=
如果值相同,则返回True
。@F3AR3DLEGEND对于2这样的简单整数,is
测试将始终有效,因为它是一个不可变类型,所以它的所有实例都位于同一内存中。但是我同意,一般来说,is
应该只在需要检查两个对象是否是同一个对象时使用。谢谢大家。我还发现我的代码中有一个错误;我总是需要四舍五入。是时候弄清楚了!haha@lxop:实际上,is
测试只起作用,因为CPython引用解释器中的int
缓存很小(这是一个实现细节)。不能保证2
在任何其他Python解释器中都是单例的,也不能保证在未来的CPython版本中都是单例的,而且这绝对不是所有int
s都是单例的问题(小型int
缓存覆盖从-5
到256
IIRC的数字,因此对257
的每次引用都会创建一个新的257
)。