Постановка задачи:Корректность и логика алгоритма: минимальные шаги к одному
На целое положительное число, вы можете выполнить любое из следующих 3-х шагов.
Вычесть 1 из него. (П = п - 1)
Если его делится на 2, делят на 2. (если п% 2 == 0, то п = п/2)
Если его делится на 3, разделить на 3. (если п% 3 == 0, то п = п/3)
Учитывая положительное целое число п и Ваша задача найти минимальное количество шагов, которые принимает п к одному.
Мое рекурсивное решение (на C++) сравнивает все 3 случая, когда N делится на 3, тогда как общее решение сравнивает только 2, но все же дает правильное решение.
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));
}
}
Но общее решение,
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));
}
}
Мой вопрос, как же мы не сравниваем все 3 случая, но все же получить на правильное решение. Я не могу следовать алгоритму общего решения. Любая помощь, которая позволила бы мне понять, была бы очень признательна.
Кроме того, это заверило правильность моего алгоритма. – linvenuza