2013-09-27 9 views
0

Edit: Исправленный код (Спасибо за ответы и помощь!)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' никогда не становится равным нулю? Или, по крайней мере, не скоро, прежде чем у вас возникнет переполнение стека из-за чрезмерной рекурсии вашей функции arr1. – lurker

+0

Итак, я добавил: if (i == 2 * n) { cout << "\ n"; return arr1 (n, 1, - j);} Теперь он печатает, но по-прежнему существует ошибка форматирования. – user2821771

+0

Почему декремент j у меня в исходном коде, который я разместил, не меняет значение j? Я думал, что это уменьшит j, а затем достигнет рекурсивного шага. частью моей проблемы было также то, что я не сбросил счетчик i после того, как j был изменен. – user2821771

ответ

0

Решение о том, чтобы рекурсивный сводится к значению j - но вы получите j от main, и никогда не изменять его впоследствии, если i==2*n, передавая ту же самую ценность, когда она называет себя рекурсивно. Так что да, это приводит к бесконечной рекурсии (если вы первоначально передаете ненулевое значение для j, так или иначе).

0

Вы логика в функции arr1 неправильно, например, если c=3 в начале,

I, J, п значения в arr1 будет в каждой итерации

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 

...

тогда он идет вечно до переполнения стека.

Смежные вопросы