Báo cáo vấn đề:Chính xác và logic của thuật toán: các bước tối thiểu cho một
Trên số nguyên dương, bạn có thể thực hiện bất kỳ một trong 3 bước sau đây.
Subtract 1 từ nó. (N = n - 1)
Nếu chia nó cho 2, chia cho 2. (nếu n% 2 == 0 thì n = n/2)
Nếu chia hết cho mình bằng 3, chia bởi 3. (nếu n% 3 == 0 thì n = n/3)
cho một số nguyên dương n và bạn nhiệm vụ là tìm số tối thiểu là bước mà mất n để một.
Giải pháp đệ quy của tôi (bằng C++) so sánh tất cả 3 trường hợp khi N chia hết cho 3, trong khi giải pháp chung chỉ so sánh 2, nhưng vẫn đưa ra giải pháp đúng.
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));
}
}
Nhưng giải pháp chung là,
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));
}
}
Câu hỏi của tôi là, làm thế nào chúng ta không so sánh tất cả 3 trường hợp, nhưng vẫn lấy được tại các giải pháp đúng. Tôi không thể làm theo thuật toán của giải pháp chung. Bất kỳ sự giúp đỡ nào cho tôi hiểu sẽ được đánh giá rất cao.
Ngoài ra, nó còn đảm bảo tính chính xác của thuật toán của tôi. – linvenuza