Нет необходимости идти рекурсивно. Вот пример итеративного подхода для начала. Он распечатывает все возможности, но вам может не понравиться его поведение. Уловка оставлена на усмотрение читателя; -)
string tab[10]={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
string s="1201075384"; //input string
for(int mask=0;mask<1048576;mask++)//4^10, trying all the posibilities
{
int m=mask;
string cur="";
for(int i=0;i<s.size();i++,m/=4)
if (m%4<tab[s[i]-'0'].size())
cur+=tab[s[i]-'0'][m%4];
cout<<cur<<endl;
}