[Tutor] A recursion question

Kĩnũthia Mũchane kinuthia.muchane at gmail.com
Fri Nov 18 20:26:12 CET 2011


On 11/18/2011 06:04 PM, Dave Angel wrote:
> On 11/18/2011 08:16 AM, Kĩnũthia Mũchane wrote:
>> <snip>
>>
> Well, it doesn't count the number of occurrences correctly if the list 
> is empty.  It should get zero, and it gets -1.  But for any non-empty 
> list, nothing ever looks at the -1 value, so it doesn't matter what 
> you put there.   This example diverges from traditional recursion in 
> many ways, but the chief reason it's not traditional recursion is that 
> it never uses the return value. within the function.
>> 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 ? 
> Nowhere.  You don't use it, so it gets discarded.  if you were going 
> to use it, your internal calls to the method would look something like:
>       b = self.slais(lst[1:], x)
>  and then you'd do something with b.
>> Further, why do not I get a *TypeError*  when I use a simple *return* 
>> statement in the *if* clause?
>>
> You would if you actually used the value for arithmetic.  But the 
> return itself would be perfectly legal.  it's just a shortcut for 
> 'return None'
>> 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.
>>
> Using a class is fine.  But you're abusing it.  What happens if you 
> try to sum a second list?  (Hint, it gives you a higher number)
That is very true, I tried it with a second list and the value was higher.
>> Thanks...
>>
> If you really want to recursively count, you need a structure which 
> uses no objects of global lifetime.  The intermediate values should be 
> stored in local variables to that method.
>
> def counter(mylist, val):
>       if len(mylist == 0):
>              return 0
>       prev = counter(mylist[1:], val)     #this is actually using the 
> recursive return value
>       if mylist[0] == val:
>             return prev + 1
>       else:
>             return prev
I was trying to come up with something like this but I was totally 
stumped. Now I understand, perfectly.
My heartfelt thanks to you, Dave, and Christian ! ;-)
>
> Totally untested.  And there are certainly many other variants 
> possible.  But the key is you have to do something with the value 
> returned to you by the lower level function.
>
>
>
>
>


-- 
Kĩnũthia

S 1º 8' 24”
E 36º 57' 36”
1522m



More information about the Tutor mailing list