problema dichiarazione:correttezza e logica di algoritmo: passi minimi ad uno
Su un intero positivo, è possibile eseguire uno qualsiasi dei seguenti 3 passaggi.
Sottrarre 1 da esso. (N = n - 1)
Se la sua divisibile per 2, dividere per 2. (se n% 2 == 0, allora n = n/2)
Se la sua divisibile per 3, dividere da 3. (se n% 3 == 0, allora n = n/3)
Dato un intero positivo n e compito è trovare il numero minimo di passi che prende n a uno.
La mia soluzione ricorsiva (in C++) confronta tutti i 3 casi in cui N è divisibile per 3, mentre la soluzione generale confronta solo 2, ma fornisce comunque la soluzione corretta.
int min_steps(int N){
if(N==1) return 0;
else{
if(N%3==0){
if(N%2==0)
return (1+min(min_steps(N/3),min_steps(N/2),min_steps(N-1)));
else
return(1+min(min_steps(N/3),min_steps(N-1)));
}
else if(N%2==0){
return(1+min(min_steps(N/2),min_steps(N-1)));
}
else
return(1+min_steps(N-1));
}
}
Ma la soluzione generale è,
int min_steps(int N){
if(N==1) return 0;
else{
if(N%3==0){
return(1+min(min_steps(N/3),min_steps(N-1)));
}
else if(N%2==0){
return(1+min(min_steps(N/2),min_steps(N-1)));
}
else
return(1+min_steps(N-1));
}
}
La mia domanda è, come mai non ci confrontiamo tutti i 3 casi, ma ancora deriviamo alla soluzione corretta. Non riesco a seguire l'algoritmo della soluzione generale. Qualsiasi aiuto per farmi capire sarebbe apprezzato enormemente.
Inoltre, ha rassicurato la correttezza del mio algoritmo. – linvenuza