Q&A

  • 재귀호출과 For문
초보라서 여쭤요.

Treenode를 사용할 경우 재귀호출을 사용하는 경우가 많지요?
재귀호출을 사용하는 경우와 For문을 사용하는 경우
어느쪽이 어떤이득이과 불이익이 있을까요?

// 재귀를 사용하는 경우
function recursive(tn:TTreeNode):string;
var i:integer;
begin
  if tn.items.count>0 then
    for i:=0 to tn.items.count-1 do
      recursive(tn.item[i]);
  else
    result:=tn.text;
end;


// For문을 사용하는 경우
  for i:=0 to treeview1.items.count-1 do
    str:=str+treeview1.items[i].text;
5  COMMENTS
  • Profile
    착한천사 2004.09.04 02:28
    착한천사 김경록입니다..

    TreeNode를 사용하신다니..
    그 용도에 따라서, 어떤 불이익이나 이익을 따지긴 그렇군요..
    TreeNode를 사용하는 목적에 따라서 대부분
    그 이익이 결정되지만,
    TreeNode의 "Depth*Terminal Node수"로 계산해서..
    Memory Overflow를 발생시키지 않는 한도내에서는
    속도상에는 큰 불이익은 나타나지 않습니다..

    단지, Depth*Terminal Node수가 너무 많다면,
    문제가 되겠습니다..
    이때는 귀찮더라도 루프문(델파이에서는 for 루프문이 제일빠름)을
    사용하는 방법을 써야되겠습니다..

    간단한 예로,
    어떤 회사에서 부서를 TreeNode로 구현한다면,
    당연히, 재귀함수를 사용하겠지요..

    그렇지 않고,
    아주 큰 회사에서 사용하는 ERP의 생산부분을 예로 들면,
    각 공정별 어떤 연결성을 가지게끔 DB를 Tree구조로 편성할 수 있습니다.
    이것은 많으면, 몇개의 연결성을 가지거나, 수백개의 연결성 혹은
    중복적인 연결성등을 가질 수 있습니다..
    따라서, 이때는 For문같은 것을 사용할 수 있겠지만,
    자료구조론을 보신분들은 곧바로 아시겠지만,
    좀 귀찮습니다..
    글거적 대는 것도 많구요..

    따라서, 속도상의 큰 하자가 없다면,
    대부분 재귀호출을 선호하는 편입니다..
    즉, 속도차이가 나 봤자, DB를 이용하지 않는다면,
    대부분 2초이내에 끝나게 될 것이므로,
    귀찮은 for문 같은것은 사양하게 될 것입니다..

    이런 이론적인 견해는
    답이라기보다는 주관적 견해가 많이 들어가겠군요..
    답은 아니지만,
    업무를 추진하고, Treenode를 수없이 만들어봤던,
    그런 놈이 한번 끌거적 해 봤습니다..



  • Profile
    한상훈 2004.09.04 10:44
    제 질문의 경우는 한번에 전체트리를 모두 처리할 경우입니다.

    개인적으로 갈등하는 부분은

    재귀호출시에는 현재 위치를 인식하기 위해
    노드데이터(레벨,Text,부모,자식등등)에 의존하게 되면
    코드가 좀 번거롭게 될것 같았기 때문입니다.

    반면에 for를 쓴다면 노드데이터보다는
    간편하게 지역변수 몇개만 이용하면 될것 같았거든요.
    (AbsoluteIndex 이용)

    별것 아닐수도 있지만 프로그램하다보면 항상 직면하는 작은 문제들이라고 생각합니다.
    어쨌거나 통상적으로 많이 선호되는 방법이 바람직하겠죠. ^^
  • Profile
    이중철 2004.09.03 20:57
    재귀함수의 큰 장점은 코드가 적어지고 직관적으로 알수 있다는 것이고
    단점은 For문 보다 속도가 늦다는 것입니다. 재귀함수는 한번 콜할때마다
    스택에 Parameter들을 Pushing하는데 여기에 대한 메모리 문제가 발생
    되여 Stack Overflow가 발생할 여지가 있습니다.

    For문 재귀함수와는 반대이겠죠

    님께서 올리신 예는 두개가 다른 의미입니다. 만약 상기예의 첫번째

    재귀호출을 아래 For문 또는 순환문으로 해결하려면 재귀함수 코드의

    3배이상의 코딩이 필요하고 또한 Goto문도 간간히 필요합니다.

    Treenode는 이중Linked list 이라고 보시면 되고요

    이것에 대한 서적은 데이터구조론에 잘 서술되어 있습니다.

    데이터구조론은 전산이라면 전공필수이고 수학이나 전기,전자는

    교양필수 이상으로 설정된 과목(15년전)이니  전산인들은 한번쯤

    읽어야하는 필독서입니다.

    꼭 한번 읽어보세요


  • Profile
    홍성락 2004.09.03 18:46

    hsr//////////////////////////////////////////////////////////////
    재귀호출는 자신(함수)을 직/간접적 반복하는건데요, 일정하게 반복되는 규칙이 있으면 효율적이거든요, 2진 탐색 등에요, 안써도 되나 코딩이 복잡해지고 서브함수등이 필요할 수 도 있습니다.
    통상 트리구조에서는 하위도 똑같은 구조이므로 많이 씁니다.
    위에서 트리노드에서 재귀호출을 쓴다면 누가부모고 누구의 자식인지 찾을때 많이 쓰는데요
    아래 for문은 그냥 인덱스 순서로 나열하거나 단순 검색시 쓰구요.

  • Profile
    모영철 2004.09.03 18:38
    제가 트리뷰를 잘몰라서 그런데..

    두가지 예는 다른 코딩 아닌가 싶은데요..

    적으신 재귀호출의 예는

    하위노드가 있으면 주욱 추가해주고 다음 노드로 넘어가는것이고.

    아래 For문은 그냥 상위노드들만 값을 가지고 오는거 아닌가요?

    재귀호출을 어떨때 사용하는가 대해서 물으시는게 원하는 답을 얻으실수 있을거 같습니다.

    제가 알고있는 예는 언급하신 트리모양.....말고는 없네요..

    양병규님의 어떤 자료였는지는 모르겠지만...

    다운로드링크가 다운하려는 파일을 가리키고 있는지 찾는 펑션에서 재귀호출을 썼었구요..이거는 for문으로도 가능하겠지만요..

    다른건 탐색기 만들때 검색부분에서 검색할때 재귀호출을 이용해서 검색
    했었습니다.

    • 장태원
    • 2004.09.03 23:29
    • 1 COMMENTS
    • /
    • 0 LIKES
    • KDDG_Apine
      2004.09.04 02:08
      안녕하세요  ^^; 돈이입니다... 메일에서 HTML를 첨부로 보낼때 어떻게 하냐를 물어보시는거...
    • 김용렬
    • 2004.09.03 21:31
    • 4 COMMENTS
    • /
    • 0 LIKES
    • mrdelphi
      2004.09.04 19:49
      허접 답변하나 드리겠습니다. 오라클 안쓰본지 너무 오래되서 기억이 가물가물하네요 혹시 특정프로...
    • 황성욱
      2004.09.03 22:29
      트랜잭션을 써서 하면 되지 않을까 싶네요. StartTransaction, Commit, Rollback을  사용하면...
    • 김용렬
      2004.09.04 02:51
         이 애기는 다른데서도 들었는데요...    정확히 이해를 못하겠어요.... Help&...
    • 황성욱
      2004.09.04 22:25
      음 테스트 함 해보셔여. db.startTransaction; try    인서트문 1(테이블 명 : tb_sample...
    • 강인규
      2004.09.03 23:12
      쓰시는 버퍼뒤에 #13#10 두바이트를 추가해주시면 될것 같네요. Writeln함수도 거의 비슷한 원리군요. ...
    • 도룡뇽
    • 2004.09.03 19:37
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 비니
    • 2004.09.03 19:36
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 서기원
      2004.09.03 22:42
      http://www.madchick.com/Default.asp?Page=2&SubPage=8&3thPage=2 을 참조하세요..
    • 비니
      2004.09.06 21:01
      tlb에서 property를 추가하고 (aaa라는 이름으로 추가했다면) function Get_aaa: WideString; begin &...
    • 김우영
    • 2004.09.03 19:35
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 박성준
      2004.09.04 05:36
      안녕하세요? 박성준입니다. License를 얻으셔야하는것아닌가요? 델파이의 License가 끝났다라는건가요? L...
    • 김우영
      2004.09.04 09:41
      컴포넌트 만들때 License 얻으라는 메세지가 안나오던데... License 때문인지 컴포넌트를 만들어서 ...
    • 박성준
      2004.09.04 10:49
      안녕하세요? 박성준입니다. 제생각입니다만... 컴포넌트도 델파이에 종속해있는것이므로 License를 얻어...
    • 한상훈
    • 2004.09.03 12:07
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2004.09.04 02:28
      착한천사 김경록입니다.. TreeNode를 사용하신다니.. 그 용도에 따라서, 어떤 불이익이나 이익을 따지...
    • 한상훈
      2004.09.04 10:44
      제 질문의 경우는 한번에 전체트리를 모두 처리할 경우입니다. 개인적으로 갈등하는 부분은 재귀호출...
    • 이중철
      2004.09.03 20:57
      재귀함수의 큰 장점은 코드가 적어지고 직관적으로 알수 있다는 것이고 단점은 For문 보다 속도가 늦다는 ...
    • 홍성락
      2004.09.03 18:46
      hsr////////////////////////////////////////////////////////////// 재귀호출는 자신(함수)을 직/간접...
    • 모영철
      2004.09.03 18:38
      제가 트리뷰를 잘몰라서 그런데.. 두가지 예는 다른 코딩 아닌가 싶은데요.. 적으신 재귀호출의 예는...
    • 정수지
    • 2004.09.03 01:27
    • 3 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2004.09.03 05:59
      Ctrl + F12를 눌러서. .dpr   (프로젝트 파일)을 열어서.. Application.Run;  이...
    • 남양원
      2004.09.03 02:00
      Project Option 부분에서 Forms탭에서 Auto-create Forms에서 메인폼만 남기시고 다른 폼들을 Availabl...
    • 장덕곤
      2004.09.03 05:17
      그리고 제일먼저생성하시고자하는폼을 제일 위로 이동하시믄 됩니다... PS 수지님 간만입니다.ㅋㅋ
    • JW Park
    • 2004.09.02 22:59
    • 3 COMMENTS
    • /
    • 0 LIKES
    • mrdelphi
      2004.09.04 20:06
      프로그래밍기술을 처음해보시는분이라면 다른분들 말씀대로 서점에서 아~~ 쉽구나하는 느낌을 받는 책으...
    • 주정호
      2004.09.03 17:18
      다른 분들이 추천하는 델파이 책을 참조하시고, 더불어 다음과 같은 전산관련 전공서적을 필독하시는게 좋...
    • 석주현
      2004.09.03 01:33
      처음 시작하신다면 서점에 가셔서 자신이 봤을때 아 이렇구나 하는 감이 빨리 오는 책이 좋다고 생각합...
    • 김영대
      2004.09.03 01:21
      제 홈페이지( http://www.howto.pe.kr )에 예제가 있습니다 Delphi Tip & Trick 에서 "실행시 component...
    • 스머프
    • 2004.09.02 18:47
    • 2 COMMENTS
    • /
    • 0 LIKES
    • nilriri™
      2004.09.03 06:16
      이 정도면 원하는 결과가 충분히 나올수 있을것 같습니다. 우선 panel을 한 놓으시고.. 리치 에디터를 ...
    • 김영대
      2004.09.03 01:05
      // UNDO 버퍼를 이용해서 트릭을 써봤습니다 // 하지만 undo 버퍼를 사용하므로 사용자가 Ctrl+Z 를 누르...
    • 김재훈
    • 2004.09.02 12:57
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김형균
    • 2004.09.02 03:43
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 황성욱
      2004.09.03 22:39
      ^^ 초보 답변 들어갑니다. INSERT    INTO     테이블명 [컬...
    • 펭귄
      2004.09.02 04:04
      저도 초보지만 insert 할 때 insert할 필드명을 values 앞에 명기하여 나열할 경우에는 나열한 순서대로 ...
    • 김길남
    • 2004.09.02 02:22
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 박운선
    • 2004.09.02 02:21
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 박운선
      2004.09.02 23:23
      ip works 라는 프로그램에 snmpv2까지지원하더군요... v5는 v6은 snmp v3까지 지원하는것 같구요.. 어렵...
    • 이중철
      2004.09.03 02:15
      음 Open이라고 되어 있네요 이건 보통 데이터셋 으로 Select할때 쓰는 방법이고 Insert, delete또는 upda...
    • 뮤젤
    • 2004.09.01 21:42
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 박상기
      2004.09.03 10:54
      쓰고 계시는 JVCL의 버젼이 어떻게 되는지 먼저 얘기하시기 바랍니다.
    • 뮤젤
      2004.09.04 01:04
      관심을 보여주셔서 정말 감사합니다. 버전은 2.1 패치 버전입니다.
    • 김동민
    • 2004.09.01 20:49
    • 0 COMMENTS
    • /
    • 0 LIKES