pub fn factorial(n: u32) -> u32 {
let mut result = 1;
for i in 1..=n {
// overflowing과 wrapping을 사용하기 보다는
// saturating multiliaction을 사용해 u32의 최댓값에서 멈추도록 하세요
result *= i;
}
result
}
2.8에서 오버플로우 문제를 해결하기 위해 dev profile의 overflow-checks를 false로 설정했는데, 이는 전체 프로그램에 영향을 미치게 되므로 썩 좋은 방법은 아니다.
산술 연산마다 제공되는 wrapping 메서드를 이용할 수 있다.
혹은 saturating 메서드를 사용할 수 있는데, 래핑처럼 값을 넘겨버리는 대신, 타입의 최댓값 혹은 최솟값을 반환한다.
u8 타입의 255와 1을 더하더라도, saturating 메서드를 사용하면 최댓값인 255가 연산 결과가 된다.
해답:
pub fn factorial(n: u32) -> u32 {
let mut result: u32 = 1;
for i in 1..=n {
//saturating_mul 메서드 사용
result = result.saturating_mul(i);
}
result
}