'재귀함수'에 해당되는 글 3건

  1. 2013.02.22 모든 하위 노드 출력하기
  2. 2012.12.23 이진 탐색 알고리즘의 재귀적 구현
  3. 2012.12.23 함수의 재귀적 호출

children() 함수: 하위 노드들의 목록을 보여줍니다.

name(): 이름을 보여줍니다.


1. 일단 아무노드나 만듭니다~


2. geo2 의 하위노드들 


3. python창에서 작업을 하면, 디버깅하기가 여간 불편한것이 아니라서... 디버깅을 편하게 하기 위해, 그리고 단순 클릭만으로 스크립트가 실행되게끔 하려고 shelf 툴에서 작업을 하였습니다. 

shelf 에서 마우스 오른쪽 클릭을하면, Edit Shelf가 나오는데 그것을 클릭 후 Script Language를 Python으로 바꾸어주면 됩니다. 

그 다음, 아래의 소스코드를 작성하시면 됩니다.

이 소스코드에서 PrintChild함수는 재귀함수(함수안에서 다시 자기 자신을 호출하는 함수)입니다. 여기서 재귀함수를 쓴 까닭은 트리구조에서 재귀함수를 쓰면, 코드가 상당히 간결해집니다. 물론 쓰지 않고 함수를 구성해도 됩니다만 코드가 상당히 너저분해지고 까다로워질 것이라 생각합니다. 

그래서 트리구조에서 하위노드들을 가져올 때, 재귀함수를 써서 가져옵니다. 

후디니는 노드구조(트리구조) 이기때문에 재귀적으로 구현해야 코드가 간결해집니다. 트리구조와 재귀함수의 관계가 무엇인지 다 아시겠지만, 혹 궁금하신 분들은 "이진 트리의 순회"를 찾아보시면 좋을 것 같네요.

위키백과: http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%A6%AC_%EC%88%9C%ED%9A%8C

PrintChild함수 내에서 가장 중요한 라인은 5번째 라인입니다. 5번째 라인을 보시면 다시 자기자신을 호출합니다.

그래서 첫번째 인수인 node로 진행중인 child가 전달되고, 두번째 인수로 indent가 +3이 되어 3이 전달됩니다.

그 다음, 하위노드가 또 다시 존재한다면, 첫번째 인수인 node로 진행중인 child가 전달되고, 두번째 인수로 indent가 +3이 되어 6이 전달됩니다.

이렇게 더 이상 하위노드가 존재하지 않을때까지 내려가면, node.children()은 None을 리턴하고 for문은 거짓이되어 자기를 호출했던 곳으로 다시 돌아갑니다.

그렇게 맨처음 자기자신을 호출했던 곳까지 돌아가고 함수가 끝납니다. 

재귀함수를 글로 설명하려니 참 애매하네요. 그림으로 보시면 아마 금방 이해하실겁니다. 재귀함수의 관한 그림 많으니 한번 찾아보시면 좋을 듯 합니다.


4. 위의 스크립트의 실행 결과입니다. 

결과를 보시면, ipr_camera노드의 하위노드 caOrigin, file1, xform1이 보이네요.

geo1는 file1...

그런데 위의 스크립트는 파이썬 창을 열어야 확인가능합니다. print문은 python창으로 출력을 보내네요. 리눅스에서는 이렇게 되는데 윈도우에서는 어떨지 모르겠습니다. 

여하튼, 보기가 좀 불편합니다. 


5. 여기서는 print문 대신에 메시지를 띄우기위해 hou.ui.displayMessage를 함수를 썼습니다.

그리고 이 함수를 써서 결과물을 잘 나오게 하도록 '\n'(new line) 을 넣었습니다.


6. 실행 결과


'Houdini > Python' 카테고리의 다른 글

Scene View Select (obj, geo, dop, etc...)  (0) 2013.07.11
rot, trans, scale  (0) 2013.05.25
hou Module Functions  (0) 2013.04.01
Python으로 만든 뷰창 옵션 지우기  (0) 2013.02.23
Houdini Python Test  (0) 2013.02.20
Posted by scii
:

이진 탐색 알고리즘은 수식적으로 표현하기는 부적절하지만 알고리즘의 논리 자체는 재귀적이기 때문에 충분히 가능하다.


이진 탐색 알고리즘은 두 번째 시도 이후부터는 탐색 대상을 찾을 때까지 동일한 패턴을 반복한다. 

때문에 알고리즘 자체는 재귀적인 성격을 지니고 있다. 그래서 재귀적으로 정의가 가능하다. 


# 이진 탐색 알고리즘의 반복 패턴

1. 탐색 범위의 중앙에 목표 값이 저장되었는지 확인.

2. 저장되지 않았다면 탐색 범위를 반으로 줄여서 다시 탐색 시작.


# 재귀 함수의 탈출 조건

"탐색 범위의 시작위치를 의미하는 first가 탐색 범위의 끝을 의미하는 last보다 커지는 경우"



이진 탐색 알고리즘을 성능이 떨어지는 재귀함수 기반으로 구현한 이유.

- 재귀함수에 익숙해지기 위함이다.

- 재귀 함수를 기반으로 구현된 위의 이진 탐색 알고리즘도 자연스럽게 이해할 수 있을 정도가 되어야 한다


Posted by scii
:

재귀는 자료구조와 알고리즘에 있어서 매우 중요한 요소이고, C언어는 이렇듯 중요한 재귀를 지원하는 언어이다.

재귀함수란, 함수 내에서 자기 자신을 다시 호출하는 함수를 의미한다.


"재귀 함수를 실행하는 중간에 다시 재귀 함수가 호출되면, 재귀 함수의 복사본을 하나 더 만들어서 복사본을 실행하게 된다."


실제로 함수를 구성하는 명령문은 CPU로 이동이 되어서(복사가 되어서) 실행이 된다. 그런데 이 명령문은 얼마든지 CPU로 이동이(복사가) 가능하다. 

따라서 재귀 함수의 중간쯤 위치한 명령문을 실행하다가 다시 재귀 함수의 앞 부분에 위치한 명령문을 CPU로 이동시키는 것은 문제가 되지 않는다. 그래서 재귀적인 형태의 함수호출이 가능한 것이다.



위의 코드에서 Recursive 함수에 0이 전달도면서 '재귀의 탈출조건'이 성립되어 함수가 반환하기 시작한다. 

이렇듯 재귀함수의 정의하는데 있어서 탈출조건을 구성하는 것은 매우 중요한 일이다.




재귀함수의 디자인 사례


- 재귀함수는 자료구조나 알고리즘의 어려운 문제를 단순화하는데 사용되는 중요한 무기이다. 무엇보다도 재귀함수가 있기에 재귀적인 수학적 수식을 그대로 코드로 옮길 수 있다.



# 팩토리얼

위의 식에서 보이듯 f(0)에 해당하는 0!이 1이므로 이것이 재귀함수의 탈출조건이 된다. (수학적으로 0!과 1!은 모두 그 값이 1로 동일하다) 따라서 이제 위의 식은 재귀함수를 이용해서 그대로 코드로 옮길 수 있다.



함수의 코드만 이해하려  하지 말고 그 과정을 이해하려고 노력해야 한다.


Posted by scii
: