μ€λμ μ¬κ·μ λν΄μ μ 리ν΄λ³΄λ €κ³ νλ€.
μ¬κ·λ μ½ν μμ κ°μ₯ λ§μ΄ λμ€λ DFS, BFSλ₯Ό μ΄ν΄νκΈ° μν΄μ λ°λμ μμμΌ νλ λ΄μ©μ΄κΈ° λλ¬Έμ μ 리ν νμλ κ³μ μ¬λ¬ μμ λ€μ νμ΄λ³΄λ©΄μ μ΅λν΄μΌλ κ² κ°λ€.
μ¬κ·λ μ½κ² λ§ν΄μ μκΈ° μμ μ νΈμΆνλ ν¨μμ΄λ€.
μλ₯Ό λ€μ΄, 1λΆν° 10κΉμ§ λνμ¬ μΆλ ₯νλλ‘ μμ νλ€λ©΄ μλμ κ°μ΄ forλ¬Έμ μ΄μ©νμ¬ μΆλ ₯νλκ² λ¨Όμ λ μ€λ₯Ό κ²μ΄λ€.
public class Main {
public static void main(String[] args) {
System.out.println(loop());
}
public static int loop() {
int n = 0;
for (int i = 1; i <= 10; i++) {
n += i;
}
return n;
}
}
κ·Έλ¦¬κ³ μ΄κ²μ μ¬κ·λ₯Ό μ΄μ©νμ¬ μμ νλ€λ©΄ μλμ κ°μ μ½λλ‘ ν μ μλ€.
public class Main {
public static void main(String[] args) {
System.out.println(recursion(10));
}
public static int recursion(int n) {
if (n == 1) return 1;
return n + recursion(n - 1);
}
}
μ΄ μμ λ₯Ό 보면 recursion λ©μλ μμμ n += recursion(n + 1), μ¦ μκΈ° μμ μ νΈμΆνλ κ²μ μ μ μλ€.
κ·Έλ¦¬κ³ μκΈ° μμ μ νΈμΆνλ€λ μ μμ λκ° λ°λ³΅μ μΈ λμμ νλ€λ κ²μ λμΉμ± μ μμ κ²μ΄λ€.
μκ³ λ¦¬μ¦ λ¬Έμ λ₯Ό νλ€λ³΄λ©΄ λ¬Έμ μμ λκ° λΉμ·ν λ΄μ©μ΄ 꼬리μ 꼬리λ₯Ό 무λ ννλΌλ©΄ μ¬κ·ν¨μλ₯Ό μ΄μ©νμ¬ ν μ μλμ§ λ¨Όμ κ³ λ €ν΄λ΄μΌ νλ€.
κ·Έλ λ€λ©΄ μ¬κ·ν¨μλ₯Ό μ¬μ©νλ©΄ μ΄λ€ μ₯μ μ΄ μκ³ λ¨μ μ΄ μμκΉ??
μ₯μ
λ°λ³΅λ¬Έμ μ¬μ©νμ§ μκΈ° λλ¬Έμ μ½λκ° κ°κ²°ν΄μ§λ€.
- μμ μμ£Ό κ°λ¨ν μμ λ§ λ΄λ μ¬κ·ν¨μλ₯Ό μ΄μ©νκ² λ κ°κ²°ν΄λ³΄μ΄μ§ μλ μκ°μ΄ λ λ€.
λ¨μ
μλκ° λ리λ€.
- κ²°κ΅ λ©μλλ₯Ό κ³μ νΈμΆνλ κ²μ΄κΈ° λλ¬Έμ λ°λ³΅νλ λ§νΌ μ€νμ μμ΄κ² λλ€. λ©λͺ¨λ¦¬λ₯Ό κ·Έλ§νΌ μ¬μ©νλ€λ³΄λ μλκ° μ νλ μ λ°μ μλ€. μ¬μ§μ΄ 무리νκ² νΈμΆνλ©΄ Stack Overflow μ€λ₯κ° λ°μν μ μλ€.
νμ§λ§ μ΄ λ¬Έμ λ 꼬리 μ¬κ·λ₯Ό μ΄μ©νμ¬ μ΅μ νκ° κ°λ₯νλ€.
꼬리 μ¬κ·
꼬리 μ¬κ·λ νΈμΆμ΄ λλλ©΄ κ²°κ³Όλ§ λ°λ‘ λ°ννλλ‘ νλ λ°©λ²μ΄λ€. λ μ€λͺ ν΄λ μλΏμ§ μκΈ° λλ¬Έμ μλ μμ λ₯Ό ν΅ν΄ μμΈν μ€λͺ ν΄λ³΄λ €κ³ νλ€.
μ¬κ·ν¨μμ λνμ μΈ μμ μΈ ν©ν 리μΌλ‘ μ€λͺ νλ €κ³ νλ€.
μλ μ½λλ μΌλ°μ μΈ μ¬κ·ν¨μλ₯Ό μ΄μ©νμ¬ κ΅¬νν κ²μ΄λ€.
public static int factorial(int n) {
if (n == 1) return 1;
return n * factorial(n - 1);
}
ν΄λΉ μ½λκ° μ΄λ»κ² λ΄λΆμ μΌλ‘ λμλλμ§ λ³΄λ©΄, factorial(3)μ νΈμΆνλ€κ³ κ°μ νμ.
μ¬κ·ν¨μλ 3 * factorial(2) / 3 * (2 * factorial(1)) / 3 * (2 * 1 ) / 3 * 2 / 6 μ΄λ°μμΌλ‘ νΈμΆ λΉν ν¨μκ° νΈμΆν ν¨μμκ² μμ μ κ²°κ³Όκ°μ μλ €μ£Όκ³ , κ·Έ κ°μ μ λ¬λ°μ ν¨μλ μκΈ°κ° κ°μ§κ³ μλ κ°κ³Ό κ³μ°μ ν΄μ λ€μ λ€λ₯Έ ν¨μμκ² μ λ¬μ νλ€.
μ΄λ²μλ 꼬리 μ¬κ·λ₯Ό μ΄μ©νμ¬ μλμ κ°μ΄ ꡬννλ€.
public static int factorialTail(int n, int result) {
if (n == 1) return result;
return factorialTail(n - 1, n * result);
}
λ± λ΄€μ λ 보μ΄λ μ°¨μ΄μ μ΄ μμ κ²μ΄λ€. λ°λ‘ 맀κ°λ³μμ κ³μ°ν κ²°κ³Όκ°μ κ°μ§κ³ μλλ‘ ν κ²μΈλ°, μμμ μ€λͺ νλ―μ΄ κΌ¬λ¦¬ μ¬κ·λ νΈμΆμ΄ λλλ©΄ κ²°κ³Όλ§ λ°λ‘ λ°ννλλ‘ νλ λ°©λ²μ΄λ€.
꼬리 μ¬κ·κ° μ΄λ»κ² λ΄λΆμ μΌλ‘ λμλλμ§ λ³΄μ. λκ°μ΄ factorialTail(3, 1)μ νΈμΆνλ€κ³ κ°μ νμ.
꼬리 μ¬κ·λ factorial(3, 1) / factorial(2, 3) / factorial(1, 6) / 6 / 6 / 6 μ΄λ°μμΌλ‘ μΌλ°μ¬κ·μ λ€λ₯΄κ² μ΄λ€ μ°μ°μ νμ§ μκ³ κ°μ μ λ¬νλ κ²μ μ μ μλ€.
μ°Έκ³
λ°±μ€ - μ¬κ· κ΄λ ¨ λ¬Έμ 리μ€νΈ
https://www.acmicpc.net/problemset?sort=ac_desc&algo=62