Vabbè se non vuoi seguire il mio consiglio
Nippolo ha scritto:
Il mio consiglio quindi è quello di implementare un algoritmo di tipo iterativo e a quel punto, se è il caso, possiamo ragionare su come convertirlo in ricorsivo.
ragioniamo pure sulla strada che hai deciso di intraprendere:
- innanzitutto quelle chiamate ricorsive sono del tutto inutili se non le fai precedere da un return;
- aggiungendo i return il programma "sembra" funzionare con le stringhe trono e torno, ma ritorna 1 anche con le stringhe abcasta e acbatsa... c'è quindi altro che non va!
- come si deduce anche dai tuoi commenti, non ha alcun senso calcolare la lunghezza delle stringhe nelle chiamate ricorsive successive alla prima.
In ogni caso il tuo codice anche una volta aggiustato sarà cmq poco performante, infatti con le funzioni strlen() e strcmp() andrai a scorrere le due stringhe molte volte, quando invece basta scorrerle 1 volta sola (o anche meno). La mia idea è la seguente:
#include <stdio.h>
int main()
{
char s1[] = "treno";
char s2[] = "terno";
unsigned int v[3];
unsigned int i = 0;
unsigned int j = 0;
while(s1[i] && s2[i] && j < 3)
{
if(s1[i] != s2[i])
{
v[j++] = i;
}
++i;
}
printf("%d", (s1[i] == s2[i] && (!j || (j == 2 && s1[v[0]] == s2[v[1]] && s1[v[1]] == s2[v[0]] && v[1] - v[0] == 1))));
}
A questo punto se proprio vuoi implementare una versione ricorsiva avrebbe molto più senso rifarsi a questo codice o cmq a qualcosa di simile.
EDIT:
Corretta una cosa nel codice.