Section6.20

]>
Book Contents Previous Section 6.19 Example: A Famous Triangle Next Section 6.21 Rules and Pattern Matching Book Index

## 6.20 Example: Testing for Palindromes

In this section we define a function pal? that tests whether its palindrome argument is a palindrome, that is, something that reads the same backwards and forwards. For example, the string ``Madam I'm Adam'' is a palindrome (excluding blanks and punctuation) and so is the number 123454321. The definition works for any datatype that has n components that are accessed by the indices 1…n.

Here is the definition for pal?. It is simply a call to an auxiliary function called palAux?. We are following the convention of ending a function's name with ? if the function returns a Boolean value.

pal? s == palAux?(s,1,#s)
Type: Void

Here is palAux?. It works by comparing elements that are equidistant from the start and end of the object.

palAux?(s,i,j) ==
j > i =>
(s.i = s.j) and palAux?(s,i+1,i-1)
true
Type: Void

Try pal? on some examples. First, a string.

pal? "Oxford"
Compiling function palAux? with type (String,Integer,Integer) ->
Boolean
Compiling function pal? with type String -> Boolean

false

Type: Boolean

A list of polynomials.

pal? [4,a,x-1,0,x-1,a,4]
Compiling function palAux? with type (List Polynomial Integer,
Integer,Integer) -> Boolean
Compiling function pal? with type List Polynomial Integer -> Boolean

true

Type: Boolean

A list of integers from the example in the last section.

pal? [1,6,15,20,15,6,1]
Compiling function palAux? with type (List PositiveInteger,Integer,
Integer) -> Boolean
Compiling function pal? with type List PositiveInteger -> Boolean

true

Type: Boolean

To use pal? on an integer, first convert it to a string.

pal?(1441::String)

true

Type: Boolean

Compute an infinite stream of decimal numbers, each of which is an obvious palindrome.

ones := [reduce(+,[10**j for j in 0..i]) for i in 1..]

[11, 111, 1111, 11111, 111111, 1111111,..11111111, 111111111, 1111111111, 11111111111,…]

Type: Stream PositiveInteger
)set streams calculate 9

How about their squares?

squares := [x**2 for x in ones]

[121, 12321, 1234321, 123454321, 12345654321, 1234567654321,.123456787654321, 12345678987654321, 1234567900987654321,.123456790120987654321,…]

Type: Stream PositiveInteger

Well, let's test them all.

[pal?(x::String) for x in squares]

[true, true, true, true, true, true, true, true, true, true,…]

Type: Stream Boolean
)set streams calculate 7
Book Contents Previous Section 6.19 Example: A Famous Triangle Next Section 6.21 Rules and Pattern Matching Book Index