2013-09-27 8 views
0

편집 : 수정 코드 내가 정수 n을 소요하는 프로그램을 작성하기 위해 노력하고있어C++ 재귀 문자 인쇄

#include <iostream> 
using namespace std; 

int arr1(const int n,int i, int j){ 
    if(j != 0) { 
    /* if(i == 2*n){ 
    cout<<"\n"; 
    --j;}*/ 
    if((i <= (n-j) || (i >= (j+n)) && i <2*n)){ 
    cout<<" "; 
    } 
    if(i < n && i > (n-j)){ 
    cout<<"\\"; 
    } 
    if(i > n && i < (n+j)){ 
    cout<<"/"; 

    } 
    if(i == n){ 
    cout<<"v"; 

    } 
    if(i == 2*n){ 
    cout<<"\n"; 
    i = 0; 
    --j;} 
    return arr1(n,++i,j); 

} 
    return 0; 
} 

    int main(){ 
    int c; 
    cin>>c; 
    arr1(c,1,c); 

    } 

(! 답변에 대한 감사와 도움) 재귀 적 화살촉 형 디자인을 인쇄

n=1 -> v 
n=2 -> \v/ 
     v 

n=3 -> \\v// 
     \v/ 
      v 

등 :

이것은 지금까지의 코드입니다. 아직 세그먼트 오류가 계속 발생합니다. 나는 코드 어딘가에 무한 루프가 있기 때문에 이것을 가정합니다.

#include <iostream> 
using namespace std; 

int arr1(const int n, int i, int j) 
{ 
    if (j != 0) 
    { 
     if (i == 2 * n) 
     { 
      cout << "\n"; 
      --j; 
     } 
     if (i <= n - j || i >= j + n) 
     { 
      cout << "_"; 
     } 
     if (i < j) 
     { 
      cout << "\\"; 
     } 
     if (i > j) 
     { 
      cout << "/"; 

     } 
     if (i == n) 
     { 
      cout << "v"; 

     } 
     return arr1(n, ++i, j); 

    } 
    return 0; 
} 

int main() 
{ 
    int c; 

    cin >> c; 
    arr1(c, 1, c); 

    return 0; 
} 
+0

분명히,'j'는 결코 0이되지 않을까요? 또는 최소한'arr1' 함수의 과도한 재귀 때문에 스택 오버플로가 발생하기 전에는 충분하지 않습니다. – lurker

+0

그래서, 다음과 같이 추가했습니다 : if (i == 2 * n) { cout << ""\ n "; return arr1 (n, 1, -j);} 이제 인쇄되지만 서식 오류가 있습니다. – user2821771

+0

내가 게시 한 원본 코드에서 j의 감소가 j의 값을 변경하지 않는 이유는 무엇입니까? 내 생각에 그것은 j를 감소시키고 재귀 적 단계에 도달 할 것이라는 것이었다. 내 문제의 일부는 j가 변경된 후 카운터 i를 재설정하지 않았다는 것입니다. – user2821771

답변

0

재귀 여부의 결정은 아래 j의 값으로 온다 -하지만 당신은 main에서 j를 수신하고 자신을 재귀 적으로 호출 할 때 동일한 값을 전달 i==2*n하지 않으면 나중에 수정하지 않습니다. 그래서 예, 무한 재귀가 발생합니다 (원래 어쨌든 j에 대해 0이 아닌 값을 전달한다고 가정). arr1 함수

0

넌 로직 arr1에서 처음에 c=3,

의 I, J, N 값이 경우 각 반복

i = 1 j = 3 n = 3 
i = 2 j = 3 n = 3 
i = 3 j = 3 n = 3 
i = 4 j = 3 n = 3 
i = 5 j = 3 n = 3 
i = 6 j = 2 n = 3 
i = 7 j = 2 n = 3 
i = 8 j = 2 n = 3 
i = 9 j = 2 n = 3 
i = 10 j = 2 n = 3 
i = 11 j = 2 n = 3 

있을 것, 예를 들어, 잘못된 ...

그러면 스택 오버플로가 발생할 때까지 계속됩니다.