if(!offset) offset = 0;
does nothing. 0 is the value of false, while anything different could be interpreted as true in many contexts (even if it does not equal true, which is 1).
With word[offset=='z']
, you probably meant word[offset]=='z'
?
I haven't completely understood your algorithm, but as there are 52^4+52^3+52^2+52^1 (+1 for empty string) different alphabetic strings of up to four letters, and you seem to iterate by doing a single tail recursion call, you should run out of call stack pretty soon.
Maybe you could write the algorithm down on paper first (in whatever language you like, but only very simple instructions, as computers are stupid), and step through it with a pen (and make sure to follow the instructions as closely as a computer would - they might be stupid, but they do what you tell them to).