: ํจ์๊ฐ ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฆ, ํํฅ์ ๋ฐฉ์(top - down) ์ด๋ค.
(1) ์ฅ์
(2) ๋จ์
public int factorial(int n) {
if (n <= 1) return 1; // ๊ธฐ์ ์กฐ๊ฑด
return n * factorial(n - 1); // ์ฌ๊ท ํธ์ถ
}
๊ธฐ์ ์กฐ๊ฑด์ด ๋ํ๋์ผ ์ฌ๊ท ํธ์ถ์ ๋ฉ์ถ๋ค.
๋ฑ ๋ค์ํ ๊ณณ์์ ํ์ฉํ ์ ์๋ค.
: ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ ๋, ๊ทธ ํธ์ถ์ด ํจ์์ ๋ง์ง๋ง ์์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ์ฌ๊ท์ด๋ค. ์ฆ, ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ ํ ์ถ๊ฐ์ ์ธ ์์ ์ ํ์ง ์๊ณ ๋ฐํํ๋ค.
// ์ผ๋ฐ์ ์ธ ์ฌ๊ท (๊ผฌ๋ฆฌ ์ฌ๊ท๊ฐ ์๋)
public int factorial(int n) {
if (n == 1) return 1;
return n * factorial(n - 1); // ๋ง์ง๋ง์ ๊ณฑ์
์ฐ์ฐ์ด ์์ด ๊ผฌ๋ฆฌ ์ฌ๊ท๊ฐ ์๋
}
// ๊ผฌ๋ฆฌ ์ฌ๊ท
public int factorialTail(int n, int acc) {
if (n == 1) return acc;
return factorialTail(n - 1, n * acc); // ์ฌ๊ท ํธ์ถ์ด ํจ์์ ๋ง์ง๋ง ์์
}
: ์ผ๋ถ ์ธ์ด์์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ์์ผ๋ก, ์ฌ๊ท ํจ์์ ๋ง์ง๋ง ํธ์ถ์ด ๋ค์ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ์ผ๋ จ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ณํํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํตํด ์คํ ๊ณต๊ฐ์ ํฌ๊ฒ ์ ์ฝํ์ฌ ํจ์ ํธ์ถ์ ์ค๋ฒํค๋๋ฅผ ์ ๊ฑฐํ๋ค.
// ๊ผฌ๋ฆฌ ์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ง ์์ ํฉํ ๋ฆฌ์ผ
public int factorial(int n) {
return factorialTail(n, 1);
}
// ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ผฌ๋ฆฌ ์ฌ๊ท ์ต์ ํ ์ ์ฉ
public int factorialIterative(int n) {
int result = 1;
while (n > 1) {
result *= n;
n--;
}
return result;
}