On 2011/11/18 03:16 PM, Kĩnũthia Mũchane wrote:
Hi,

I am trying to do something which is really stupid :-)
I would like to count the number of occurrences of a certain character in a list. This is more of an exercise in recursion rather than the underlying problem.
I could have used a *for* loop or simply the list *count* method.
Here is the code:

class Find_Ex():

    count = 0
    def slais(self, lst, x):
        if len(lst) == 0: #if list is empty just give a -1
            return -1
        elif lst[0] == x:
Find_Ex.count += 1 # we have found 'x', increment class attribute 'count' by 1 Find_Ex.slais(self,lst[1:], x)# slice the list and go to the next element
        else:
Find_Ex.slais(self,lst[1:], x)#'x' not found so we move to the next element
        return Find_Ex.count

s = Find_Ex()
lst = [4,4,4,5,6,7,4,7,7,4]
x = 4
print "There are %d occurrences of %d"%(s.slais(lst, x),x)

It works as advertised but I am convincing myself that it should not! :-)

If the list is empty, which is the base case, s.slais([], 4) returns -1. Now using some bush logic, in a non-empty list, in order for the recursion to terminate it has to 'hit' the base case and return -1. Where does this -1 go ? Further, why do not I get a *TypeError* when I use a simple *return* statement in the *if* clause?

The reason I am asking that is that I think(wrongly, of course :-)) it should be part of the answer and therefore I should be getting an answer that is off by one or a *TypeError*!!

And by the way, the reason I used a *class* was that I could not get a suitable place in the program to initialise my *count* variable otherwise.

Thanks...

If you pop in some print statements you can see what's happening a bit easier. You are creating a stack of functions which each return their values but in a LIFO fashion (Last In, First Out) so you can see the first return is -1 as you expected to happen when the list is exhausted, and then each subsequent return is the count which is why you get the correct return value in the end. Also, why do you think you should get a TypeError when you `return -1` ?

class Find_Ex():
    count = 0
    def slais(self, lst, x):
        print lst
        if len(lst) == 0: #if list is empty just give a -1
            print 'Returning -1'
            return -1
        elif lst[0] == x:
            print 'Incrementing Count'
Find_Ex.count += 1 # we have found 'x', increment class attribute 'count' by 1 Find_Ex.slais(self,lst[1:], x)# slice the list and go to the next element
        else:
            print 'Nothing Found'
Find_Ex.slais(self,lst[1:], x)#'x' not found so we move to the next element
        print 'Returning the count'
        return Find_Ex.count

s = Find_Ex()
lst = [4,4,4,5,6,7,4,7,7,4]
x = 4
print "There are %d occurrences of %d"%(s.slais(lst, x),x)

[4, 4, 4, 5, 6, 7, 4, 7, 7, 4]
Incrementing Count
[4, 4, 5, 6, 7, 4, 7, 7, 4]
Incrementing Count
[4, 5, 6, 7, 4, 7, 7, 4]
Incrementing Count
[5, 6, 7, 4, 7, 7, 4]
Nothing Found
[6, 7, 4, 7, 7, 4]
Nothing Found
[7, 4, 7, 7, 4]
Nothing Found
[4, 7, 7, 4]
Incrementing Count
[7, 7, 4]
Nothing Found
[7, 4]
Nothing Found
[4]
Incrementing Count
[]
Returning -1
Returning the count
Returning the count
Returning the count
Returning the count
Returning the count
Returning the count
Returning the count
Returning the count
Returning the count
Returning the count
There are 5 occurrences of 4

--

Christian Witts
Python Developer
//
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to