This is a part of my homework assignment and im close to the final answer but not quite yet. I need to write a function that counts odd numbers in a list.
Create a recursive function count_odd(l) which takes as its only argument a list of integers. The function will return a count of the number of list elements that are odd, i.e., not evenly divisible by 2.
>>> print count_odd([]) 0 >>> print count_odd([1, 3, 5]) 3 >>> print count_odd([2, 4, 6]) 0 >>> print count_odd([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]) 8
Here is what i have so far: #- recursive function count_odd -#
def count_odd(l): """returns a count of the odd integers in l. PRE: l is a list of integers. POST: l is unchanged.""" count_odd=0 while count_odd<len(l): if l[count_odd]%2==0: count_odd=count_odd else: l[count_odd]%2!=0 count_odd=count_odd+1 return count_odd #- test harness print count_odd([]) print count_odd([1, 3, 5]) print count_odd([2, 4, 6]) print count_odd([0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144])
Can u help explain what im missing. The first two test harness works fine but i cant get the final two. Thanks!
Advertisement
Answer
Are slices ok? Doesn’t feel recursive to me, but I guess the whole thing is kind of against usual idioms (i.e. – recursion of this sort in Python):
def countOdd(l): if l == list(): return 0 # base case, empty list means we're done return l[0] % 2 + countOdd(l[1:]) # add 1 (or don't) depending on odd/even of element 0. recurse on the rest
x%2
is 1
for odds, 0
for evens. If you are uncomfortable with it or just don’t understand it, use the following in place of the last line above:
thisElement = l[0] restOfList = l[1:] if thisElement % 2 == 0: currentElementOdd = 0 else: currentElementOdd = 1 return currentElementOdd + countOdd(restOfList)
PS – this is pretty recursive, see what your teacher says if you turn this in =P
>>> def countOdd(l): ... return fold(lambda x,y: x+(y&1),l,0) ... >>> def fold(f,l,a): ... if l == list(): return a ... return fold(f,l[1:],f(a,l[0]))