palindrome iteration
Dave Angel
davea at ieee.org
Fri Aug 27 09:14:02 EDT 2010
Bruno Desthuilliers wrote:
> <div class="moz-text-flowed" style="font-family: -moz-fixed">Baba a
> écrit :
>> level: beginner
>>
>> the following code looks ok to me but it doesn't work.
>
> "doesn't work" is about the most useless description of a problem.
> Please specify what you expected and what actually happens.
>
>> I would like
>> some hints as to where my reasoning / thought goes wrong
>>
>> def i_palindrome(pal):
>> while len(pal)>1:
>> if pal[0] == pal[-1]:
>> pal=pal[1:-1]
>
> Can you explain what happens if pal[0] != pal[-1] ? (answer below)
>
>> return True
>
>> print i_palindrome('annab')
>
> And then you go in an infinite loop !-)
>
>>
>> my reasoning:
>> - i check the length of the string: if > 1 continue
>> - i check first and last char: if they are equal continue
>> - create a new, shorter string starting at index 1 and ending at
>> second last index (up to but not including index-1
>> -restart the while loop as long as length of string is > 1
>> - exiting this loop means all compared chars were identical hence it
>> is a palindrome and i return True
>
> Your problem is that when first and last char are not equal, you don't
> exit the while loop. You need a "return False" somewhere here, ie:
>
> def is_palindrom(pal):
> while len(pal)>1:
> # NB : inverted the test here to make exit more obvious
> if pal[0] != pal[-1]:
> return False
> pal=pal[1:-1]
> return True
>
>
> Now there is another solution. A palindrom is made of two symetric
> halves, with (odd len) or without (even len) a single char between the
> symetric halves, ie :
>
> * odd : ABCBA ('AB' + 'C' + 'BA')
> * even : ABCCBA ('ABC' + 'CBA')
>
> So you just have to extract the symetric halves, reverse one, and
> compare both (case insensitive compare while we're at it). Here's a
> possible (and a bit tricky) Python 2.x implementation:
>
> def is_palindrom(s):
> s = s.lower()
> slen = len(s)
> until = slen / 2 # Python 2x integer division
> offset = int(not(slen % 2))
> runtil = until - offset
> return s[0:until] == s[-1:runtil:-1]
>
>
or (untested)
def is_palindrom(s):
s = s.lower()
return s == s[::-1]
DaveA
More information about the Python-list
mailing list