Python:获取对象的str时的最大递归深度

时间:2013-03-28 21:34:10

标签: 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 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)

2 个答案:

答案 0 :(得分:3)

因为你做的时候

convert(int(round(number, -1)))
你打电话给convert(50)。由于您的if语句未涵盖50,因此它会再次转到else,并再次调用convert(50),依此类推。

答案 1 :(得分:2)

此处的问题是round(46, -1)将生成值50。使用值convert调用50时,它将转到完全相同的行

lettercount += convert(int(round(number, -1)))

round(50, -1)调用将生成50,此时convert函数将无限执行