Python: Maximum recursion depth while getting the str of an object

15,427

Solution 1

Because when you do

convert(int(round(number, -1)))

you are calling convert(50). Since 50 isn't covered by your if statements, it gets to the else again, and calls convert(50) again, and so forth.

Solution 2

The problem here is that round(46, -1) will produce the value 50. When convert is called with the value 50 it will go to the exact same line

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

The round(50, -1) call will produce 50 and at this point the convert function will execute infinitely

Share:
15,427
Tetramputechture
Author by

Tetramputechture

Updated on June 25, 2022

Comments

  • Tetramputechture
    Tetramputechture almost 2 years

    I'm making a program to get the amount of letters in a number:

    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)
    

    It works just fine and returns a correct response for the 88 and 23, but it gives a recursion depth error on 46. I'm confused; why does it happen on just 46?


    Fixed code:

    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)