Problembeschreibung:Korrektheit und Logik des Algorithmus: Mindestschritte zu eins
Bei einer positiven ganzen Zahl können Sie einen der folgenden 3 Schritte ausführen.
1 davon subtrahieren. (N = n - 1)
Wenn sein durch 2 teilbar, Dividieren durch 2 (wenn n% 2 == 0, dann n = n/2)
Wenn sein durch 3 teilbar, divide von 3. (wenn n% 3 == 0, dann n = n/3)
eine positive ganze Zahl n und Sie Aufgabe ist es, die minimale Anzahl von Schritten finden, die n Gegeben einem nimmt.
Meine rekursive Lösung (in C++) vergleicht alle 3 Fälle, wenn N durch 3 teilbar ist, während die allgemeine Lösung nur 2 vergleicht, aber immer noch die richtige Lösung gibt.
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));
}
}
Aber die allgemeine Lösung ist,
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));
}
}
Meine Frage ist, wie kommen wir alle drei Fälle nicht vergleichen, aber ableiten noch an der richtigen Lösung. Ich kann dem Algorithmus der allgemeinen Lösung nicht folgen. Jede Hilfe, die mich verstehen lässt, wäre sehr willkommen.
Es beruhigte auch die Richtigkeit meines Algorithmus. – linvenuza