Deep_Dev

 

 

πŸ“š μŠ€νƒν”„λ ˆμž„ & μž¬κ·€ν•¨μˆ˜

 

 

μŠ€νƒ ν”„λ ˆμž„

μŠ€νƒ ν”„λ ˆμž„μ€ λ©”λͺ¨λ¦¬μ˜ μŠ€νƒμ˜μ—­μ€ ν•¨μˆ˜μ˜ 호좜과 κ΄€κ³„λ˜λŠ” μ§€μ—­λ³€μˆ˜μ™€ 맀개 λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” μ˜μ—­μ΄λ‹€. μŠ€νƒ μ˜μ—­μ€ ν•¨μˆ˜μ˜ 호좜과 ν•¨κ»˜ ν• λ‹Ήλ˜λ©°, ν•¨μˆ˜μ˜ 호좜이 μ™„λ£Œλ˜λ©΄ μ†Œλ©Έν•œλ‹€.

 

ν•¨μˆ˜κ°€ 호좜되면 μŠ€νƒμ—λŠ” ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜, 호좜이 끝날뒀 λŒμ•„κ°€λŠ” λ°˜ν™˜ μ£Όμ†Œ κ°’, ν•¨μˆ˜μ—μ„œ μ„ μ–Έλœ μ§€μ—­λ³€μˆ˜ 등이 μ €μž₯λœλ‹€. μ΄λ ‡κ²Œ μŠ€νƒ μ˜μ—­μ— μ°¨λ‘€λŒ€λ‘œ μ €μž₯λ˜λŠ” ν•¨μˆ˜μ˜ 호좜 정보λ₯Ό μŠ€νƒ ν”„λ ˆμž„ 이라고 ν•œλ‹€.

 

μŠ€νƒ ν”„λ ˆμž„μ„ ν™œμš©ν•˜λ©΄ ν•¨μˆ˜μ˜ 호좜이 λͺ¨λ‘ λλ‚œ 뒀에 ν•΄λ‹Ή ν•¨μˆ˜κ°€ 호좜되기 이전 μƒνƒœλ‘œ λ˜λŒμ•„κ°ˆ 수 μžˆλ‹€.

 

μž¬κ·€ν•¨μˆ˜

public class Recursive {
	public static void main(String[] args){
    	Recursive T = new Recursive();
        T.DFS(3);
    }
    
    public void DFS(int n){
    	if(n == 0) {
        	return;
        } else {
        	System.out.print(n + " ");
            DFS(n-1)
        }
    }
}

 

μœ„μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•œ κ²°κ³ΌλŠ” DFS ν•¨μˆ˜λ‘œ 인자 κ°’ 3이 λ“€μ–΄μ˜€κ³ , λ°˜λ³΅λ¬Έμ„ λ„λŠ”κ²ƒμ²˜λŸΌ μΈμžκ°’μ΄ 0 이 될 λ–„κΉŒμ§€ 같은 DFSλ₯Ό 계속 ν˜ΈμΆœν•˜κ²Œ λœλ‹€.

3 2 1

그러면 System.out.print()λ₯Ό μ΄μš©ν•΄μ„œ 좜λ ₯ν•˜λ©΄ μœ„μ™€ 같이 3 2 1 순으둜 좜λ ₯λœλ‹€. λ§Œμ•½ 1λΆ€ν„° μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ‚˜μ˜€κ²Œ ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ ?

public class Recursive {
	public static void main(String[] args){
    	Recursive T = new Recursive();
        T.DFS(3);
    }
    
    public void DFS(int n){
    	if(n == 0) {
        	return;
        } else {
            DFS(n-1)
            System.out.print(n + " ");
        }
    }
}

print λ©”μ„œλ“œλ₯Ό DFS ν•¨μˆ˜ μ•„λž˜λ‘œ μœ„μΉ˜ν•˜κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. 이 원리가 λ°”λ‘œ μŠ€νƒν”„λ ˆμž„μ΄λ‹€.

 

Stack

μŠ€νƒμ€ LIFO λ°©μ‹μœΌλ‘œ κ°€μž₯ λ‚˜μ€‘μ— μ €μž₯된 데이터가 λ¨Όμ € λ‚˜μ˜€κ²Œ λœλ‹€.

  1. 처음 μΈμžκ°’μœΌλ‘œ 3이 λ“€μ–΄μ˜€κ³  DFS ν•¨μˆ˜ μ‹€ν–‰
  2. 0이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— else문을 톡해 λ‹€μ‹œ ν•œλ²ˆ DFS(n-1)ν•¨μˆ˜λ₯Ό νƒ€κ²Œ λœλ‹€. μ΄λ•Œ κ°€μž₯ μ€‘μš”ν•œ 것은 DFS(3)ν•¨μˆ˜λŠ” line 11μ—μ„œ 멈좰져 μžˆλŠ” μƒνƒœλ‘œ μŠ€νƒμ— μŒ“μ΄κ²Œ λœλ‹€. μ‰½κ²Œ λ§ν•˜μžλ©΄ κ·Έ λ‹€μŒ System.out.print()λ©”μ„œλ“œκ°€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” μƒνƒœλ‘œ μŠ€νƒμ— μŒ“μΈλ‹€.
  3. κ·Έ λ‹€μŒ 인자 κ°’μœΌλ‘œ 2κ°€ λ“€μ–΄μ˜€κ²Œλœλ‹€. μ΄λ²ˆμ—λ„ 0이 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 2번 λ¬Έν•­κ³Ό λ™μΌν•˜κ²Œ μ‹€ν–‰λ˜κ³ , μ΄λ ‡κ²Œ 인자 값이 0 이 될 λ•ŒκΉŒμ§€ μŒ“μ΄κ²Œ λœλ‹€.
  4. λ§ˆμ§€λ§‰μœΌλ‘œ DFS()ν•¨μˆ˜μ— 0 이 λ“€μ–΄μ˜¨λ‹€. ν•˜μ§€λ§Œ 0 μΌλ•ŒλŠ” return을 ν•˜κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό λ°”λ‘œ μ’…λ£Œλœλ‹€. 이후에 μŠ€νƒμ— 멈좰져 있던 ν•¨μˆ˜λ“€μ΄ μ°¨λ‘€λ‘œ μ‹€ν–‰ν•˜κ²Œ λœλ‹€. 즉, λ§ˆμ§€λ§‰μœΌλ‘œ μŒ“μ˜€λ˜ 인자 κ°’ 1λΆ€ν„° μ‹€ν–‰λœλ‹€λŠ” λœ»μ΄λ‹€.

 

> μΆ”κ°€μ˜ˆμ‹œ 

νŒ©ν† λ¦¬μ–Ό

μž¬κ·€ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ νŒ©ν† λ¦¬μ–Όμ„ κ΅¬μ„±ν•œλ‹€λ©΄ ?

public class Factorial {
	public static void main(String[] args){
    	Factorial T = new Factorial();
        System.out.print(T.DFS(5));
    }
    
    public int DFS(int n){
    	if (n == 1) {
        	return 1;
        } else {
        	return n*DFS(n-1);
        }
    }
}
// κ²°κ³Ό 120

 μž¬κ·€λ₯Ό 1μ—μ„œ λ©ˆμΆ”λŠ” 것 μ΄μ™Έμ—λŠ” λ™μΌν•œ λ°©μ‹μœΌλ‘œ μž‘λ™ν•œλ‹€. 1μ—μ„œ λ©ˆμΆ”λŠ” μ΄μœ λŠ” νŒ©ν† λ¦¬μ–Όμ€ λͺ¨λ“  μ–‘μ˜ μ •μˆ˜μ˜ 곱이기 λ•Œλ¬Έμ΄λ‹€.

 

처음 μΈμžκ°’μœΌλ‘œ 5κ°€ λ“€μ–΄μ˜€λ©΄ 5 * DFS(5-1) -> μŠ€νƒμ— μŒ“μž„ 그리고 4 * DFS(4-1)μŠ€νƒμ— μŒ“μž„. μ΄λŸ°μ‹μœΌλ‘œ λ°˜λ³΅λ˜μ–΄μ„œ 인자 값이 1이 될 λ•ŒκΉŒμ§€ μ§„ν–‰λ˜κ³  λ‹€ μŒ“μ˜€λ‹€λ©΄ 맨 μœ„ μŠ€νƒλΆ€ν„° κΊΌλ‚΄μ„œ κ²°κ΅­μ—” 1 * 2 * 3 * 4 * 5 = 120의 κ²°κ³Όλ₯Ό μ–»λŠ” 것이닀.