recursion depth problem

Michael Bentley michael at jedimindworks.com
Mon Apr 23 00:37:05 CEST 2007


On Apr 22, 2007, at 4:08 PM, proctor wrote:

> On Apr 22, 2:55 pm, half.ital... at gmail.com wrote:
>> On Apr 22, 11:49 am, proctor <12cc... at gmail.com> wrote:
>>
>>
>>
>>> hello,
>>
>>> i have a small function which mimics binary counting.  it runs  
>>> fine as
>>> long as the input is not too long, but if i give it input longer  
>>> than
>>> 8 characters it gives
>>
>>> RuntimeError: maximum recursion depth exceeded in cmp
>>
>>> i'm not too sure what i am doing improperly.  is there really a  
>>> lot of
>>> recursion in this code?
>>
>>> ==================
>>
>>> import sys
>>
>>> def ch4(item, n=0):
>>>         if n < len(item):
>>>                 if item[n] == '0':
>>>                         item[n] = '1'
>>>                         print ''.join(item)
>>>                         ch4(item)
>>>                 elif item[n] == '1':
>>>                         item[n] = '0'
>>>                         ch4(item, n+1)
>>
>>> ch4(list(sys.argv[1]))
>>
>>> ==================
>>
>>> this function expects input in the form of a string of zeros, like
>>> this:
>>
>>> python test-bin.py 00000000
>>
>>> and is expected to output a list of permutations like this:
>>
>>> $ python test-bin.py 0000
>>> 1000
>>> 0100
>>> 1100
>>> 0010
>>> 1010
>>> 0110
>>> 1110
>>> 0001
>>> 1001
>>> 0101
>>> 1101
>>> 0011
>>> 1011
>>> 0111
>>> 1111
>>
>>> thanks for all help!
>>
>>> sincerely,
>>> proctor
>>
>> If you just want to make it work as is....check
>>
>> sys.setrecursionlimit()
>>
>> ~Sean
>
> very nice.  thanks sean.  so is the structure of my original code
> unrescuable?  i cannot rearrange it to bypass the recursion?
>

Anything that can be done with recursion can be done without  
recursion.  If you really wanted to mimic a binary counter, why not  
write a function that converts a number to binary?

Then you could just count up from 0, printing the return from your  
binary conversion function...

And the binary converter would be pretty easy too: just think of it  
as making change -- for a given number you just divide the number by  
each of [2 ** x for x in range(len(sys.argv[1]), 0, -1)] and append  
the string representations of the answers to a list and if the answer  
is 1, subtract that much from the number...





More information about the Python-list mailing list