Maybe it come from the fact that you are using a non-functional language for functional stuff? In Haskell I'd do it like this:
pairs[] = []
pairs(x:xs) =
map (\ y -> (x,y)) (xs) ++ pairs xs
Tried, out in console: *Main> pairs "ABCD"
[('A','B'),('A','C'),('A','D'),('B','C'),('B','D'),('C','D')]
It seems to do what is supposed to.