티스토리 뷰



재귀함수?란 무엇인가!
업로드한 엑셀 데이타에서(끝나지 않는 엑셀..지겹다) 아이디를 타고 타고 올라가
한 행의 데이타의 부모 데이타를 추출해야 하는데, 
재귀함수를 이용하면 될것 같다고 하셔서 재귀함수를 찾아보았다.


재귀함수?
학교다닐때 펙토리얼해본게 전부인데ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ하


내가 찾으려는 행(article)에 부모가 있다면 그 부모데이터가 몇행에 있는지 엑셀데이타에서 찾아 함수를 다시 호출한다.
count 값을 파라미터로 주지 않는다면 내가 처음 함수안에 들어왔을 때 내가 찾으려는 행의 데이터도 distingushName에 넣을텐데,
내 경우에는 내가 찾으려는 행의 데이터는 말고, 부모 데이터만 가지고 와야 해서 count로 첫행을 구분하였다. 

내가 찾으려는 행에 부모가 있다는 저 조건식에서 한참 헤멘것이 바보같이
문자열 String인데 " " 일때 비교를 == 이걸로 하고있었다.
equals 와 == 의 차이는 CallByValue와 CallByReference 의 차이인데
잘 몰라서 이것도 찾아보았다.

==는 연산자이고 , 주소값을 비교하는 CallByReference 이고
equals는 메소드이며, 내용(값)자체를 비교하는 CallByValue 이란다.

참고 : http://ojava.tistory.com/15


또 나는 참조한 재귀함수가 리턴타입이 void인 함수를 참고하고 있어서 
재귀함수를 다시 호출할때 distingushName 안에 값을 담아주지 않아서 계속 함수만 호출해서 디버그 천만번해봤는데
값을 안에 담아줘야한다는 것을 알지 못했다. 

같은 distingushName이라는 변수이름이지만 따로 나뉘어진 함수로 생각해서 재귀함수 호출해서 추출한 값을
다시 리턴값 받아오듯 받아오고 또 받아오고 해야한다는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public String getDistingushName(List<Map<StringString>> excelContent, int i, String distingushName, int count)throws Exception{
        
        Map<StringString> article = excelContent.get(i);
        
        if(count>0){
            if (distingushName.equals("")) {                
                distingushName = article.get("B");
            } else {
                distingushName = article.get("B"+ "$|" + distingushName; // 이름추출
            }            
        }
 
            if (!(article.get("C"== null || article.get("C").equals(""))) {
                // pGroupId가 있음
 
                for (int j = 0; j < excelContent.size(); j++) {
                    Map<StringString> article2 = excelContent.get(j);
                    if (article.get("C").equals(article2.get("A"))) {
 
                        // 여기서 재귀함수 호출
                        distingushName = getDistingushName(excelContent, j, distingushName, count+1);
                        break;
 
                    } else {
                        // pGroupId가 article2.get("A")=groupId가 아닐때
                        continue;
                    }
                }
            }
        //System.out.println(count);
        return distingushName;
    }
cs






댓글