2010-06-17 5 views
3

나는 그 정의에 의해 재귀 구현으로 의심하고있는 코드를 가지고있다. 내 이해는 코드가 정확히 동일한 함수를 호출해야한다는 것입니다. 또한이 방법으로 코드를 작성하면 재귀를 사용하여 볼 수있는 추가 오버 헤드가 추가되는지 여부에 대해 질문합니다. 당신의 생각은 무엇입니까?이 코드는 재귀 정의를 따르고 있습니까?

class dhObject 
{ 
public: 
    dhObject** children; 
    int numChildren; 
    GLdouble linkLength; //ai 
    GLdouble theta; //angle of rot about the z axis 
    GLdouble twist; //about the x axis 
    GLdouble displacement; // displacement from the end point of prev along z 
    GLdouble thetaMax; 
    GLdouble thetaMin; 
    GLdouble thetaInc; 
    GLdouble direction; 

    dhObject(ifstream &fin) 
    { 
     fin >> numChildren >> linkLength >> theta >> twist >> displacement >> thetaMax >> thetaMin; 
     //std::cout << numChildren << std::endl; 
     direction = 1; 
     thetaInc = 1.0; 
     if (numChildren > 0) 
     { 
     children = new dhObject*[numChildren]; 
     for(int i = 0; i < numChildren; ++i) 
     { 
      children[i] = new dhObject(fin); 
     } 
     } 
    } 

    void traverse(void) 
    { 
     glPushMatrix(); 
     //draw move initial and draw 
     transform(); 
     draw(); 
     //draw children 
     for(int i = 0; i < numChildren; ++i) 
     { 
     children[i]->traverse(); 
     } 
     glPopMatrix(); 
    } 

    void update(void) 
    { 
     //Update the animation, if it has finished all animation go backwards 
     if (theta <= thetaMin) 
     { 
     thetaInc = 1.0; 
     } else if (theta >= thetaMax) 
     { 
     thetaInc = -1.0; 
     } 
     theta += thetaInc; 
     //std::cout << thetaMin << " " << theta << " " << thetaMax << std::endl; 
     for(int i = 0; i < numChildren; ++i) 
     { 
     children[i]->update(); 
     } 
    } 

    void draw(void) 
    { 
     glPushMatrix(); 
     glColor3f (0.0f,0.0f,1.0f); 
     glutSolidCube(0.1); 
     glPopMatrix(); 
    } 

    void transform(void) 
    { 
     //Move in the correct way, R, T, T, R 
     glRotatef(theta, 0, 0, 1.0); 
     glTranslatef(0,0,displacement); 
     glTranslatef(linkLength, 0,0); 
     glRotatef(twist, 1.0,0.0,0.0); 
    } 
}; 
+0

들여 쓰기를 확인하십시오 – swegi

+0

pls는 향후 관련 부분에만 코드를 스니핑합니다. – danio

답변

5

그렇습니다. 특정 기능을 호출했기 때문에 가능합니다. 정의에 의하면 직접 재귀입니다. 함수 A() (함수)이 있고 B() 함수 (직접 또는 간접적으로)를 호출하는 경우 A() 함수를 다시 호출하면 간접적 인 회귀을 가질 수도 있습니다.

+0

그들은 정말로 ** 자신들을 ** 전화하고 있습니까 **? – IVlad

+0

그는 어디에서 자신을 부르는 기능을 가지고 있습니까? 그는이 함수를 호출하는 또 다른 객체를 가지고 있지만'this-> callMyFuction()'이 아닙니다. – Shaihi

+0

이 경우에는 * this *가'dhObject *'유형이기 때문에 실제로는 스스로를 호출합니다. – sharptooth

6

이것은 정의의 문제입니다/nitpicking. 이 C 함수에서 :

void traverse(tree * t) { 
    if (t != 0) { 
     traverse(t->right); 
     traverse(t->left); 
    } 
} 

함수가 재귀 적입니까? 네가 다른 대상에게 부름을 받았음에도 불구하고 나는 그렇다고 말할 것입니다. 그래서 당신의 코드 또한 재귀라고합니다. 훨씬 더 극단적 인 예를 들어 보면 :

unsigned int f(unsigned int n) { 
    if (n = 0) { 
     return 0; 
    } 
    else { 
     return f(n - 1); // XXX 
    } 
} 

XXX에서 함수가 호출되는 것은 당연히 원래 호출 된 것과 다릅니다. 그러나 모든 사람들이 이것이 재귀적인 기능이라는 데 동의 할 것으로 생각합니다.

+0

은 함수가 호출되는 개체 나 전달되는 매개 변수에 관계 없습니다. 유일한 제약 조건은 당신이 떠나기 전에 같은 기능을 다시 (직접적으로 또는 간접적으로) 호출해야한다는 것입니다. – codymanix

+0

예제가 재귀 적이지만, 예제에서는 함수가 완전히 다른 객체에 존재한다는 것에 동의합니다. 당신의 예제는 똑같은 함수를 호출하고, 광산은 다른 객체에서 함수를 호출합니다. 재귀 동작의 정의가 똑같은 함수를 호출하지 않습니까? – dekz

+0

@dekz 아니요. C++에서 함수는 객체가 아닌 클래스에 속합니다. –

0

이러한 방법 중 하나 (트래버스 또는 업데이트)를 호출하면 동일한 메소드를 모든 자식으로 호출하는 효과가 있습니다. 따라서 메서드는 재귀가 아닙니다. 대신 재귀 적 알고리즘입니다. 객체의 논리적 트리에서 재귀 적으로 적용됩니다.

호출 스택의 깊이는 알고리즘이 작동하는 데이터의 구조에 의해 직접 결정됩니다.

Function Traverse(object o) 
{ 
    [do something with o] 

    Foreach(object child in o.Children) 
     Traverse(child); 

    [do something with o] 
} 
1

는 트래버스() 및 업데이트() 개체 모음의 물리적 구조에 의해 제어 깊이 방법에 재귀 것 같은데 : 정말 어떻게됩니까

이 (의사 코드)입니다. 이 실제 클래스 인 경우

나는 몇 가지를 추천 할 것입니다 : 누군가가 실수로 현저하게 많은 수의 통과 않도록

  1. 이 그것을 사용하기 전에 NUMCHILDREN의 상한을 확인합니다.

  2. 스레드 환경에서 사용되는 경우 자식 개체에 대한 액세스를 동기화 할 수 있습니다.

  3. 배열을 할당하는 대신 컨테이너를 사용하는 것을 고려하십시오. 소멸자가 보이지 않기 때문에이 객체가 삭제되면 배열 저장소와 자식에 대한 메모리가 누출됩니다.

+0

소멸자가 포함 된 개체의 일부가 관련이 없으므로 잘라 냈습니다. – dekz

1

재귀 오버 헤드가 걱정된다면 중요한 것은 스택이 얼마나 깊은 지 측정하는 것입니다. 스택이 100 회의 깊은 호출이라면 재귀 적으로 작동하는지 여부에 관계없이 중요하지 않습니다.

+0

약 4 개의 물체가 있는데, 각각 물체가 1-2 개 있습니다. 그래서 나는 과도한 오버 헤드가있을 것이라고 생각하지 않습니다. 동의하니? – dekz

+0

예. 재귀와 관련된 유일한 문제는 당신이 정말로 깊게 갈 때입니다. – Skilldrick

관련 문제