Newbi Q: Recursively reverse lists but NOT strings?

Gary Herron gherron at islandtraining.com
Mon Oct 15 02:30:18 EDT 2007


Dmitri O.Kondratiev wrote:
>
> The function I wrote (below) reverses lists all right: 
>
> def reverse(xs):
>     if xs == []:
>         return []
>     else:
>         return (reverse (xs[1:])) + [xs[0]]
>
>  
> >>> reverse ([1,2,3])
> [3, 2, 1]
> >>> 
>
>
> Yet when I try to reverse a string I  get:
>
> >>> reverse ("abc")
>
> ...
> ...
> ...
>
>   File "C:\wks\python-wks\reverse.py", line 5, in reverse
>
>     return (reverse (xs[1:])) + [xs[0]]
>
>   File "C:\wks\python-wks\reverse.py", line 5, in reverse
>
>     return (reverse (xs[1:])) + [xs[0]]
>
>   File "C:\wks\python-wks\reverse.py", line 2, in reverse
>
>     if xs == []:
>
> RuntimeError: maximum recursion depth exceeded in cmp
>
> >>> 
>
> What's wrong? Why recursion never stops?
>
If you are doing this as an python-learning exercise, then read on.   If
you are doing this reversal for real code, then try:

  xs.reverse() for in-place reversal of a list (but not a string), or
  result = xs[::-1] for creating a reversed copy of either a string or a
list


Your recursion stops when xs == [], but when you're stripping characters
off a string,  like 'abc', the remaining portion will be 'bc', then 'c',
than '', but never [] so you 'll never stop.

Try:

if xs == []:
    return []
elif xs == '':
    return ''
else:
    ...


Gary Herron


>
> Thanks,
> Dima




More information about the Python-list mailing list